签名代码
public static String signPrefixedMessage(String content, String privateKey) {
byte[] contentHashBytes = content.getBytes();
Credentials credentials = Credentials.create(privateKey);
Sign.SignatureData signMessage = Sign.signPrefixedMessage(contentHashBytes, credentials.getEcKeyPair());
byte[] r = signMessage.getR();
byte[] s = signMessage.getS();
byte[] v = signMessage.getV();
byte[] signByte = Arrays.copyOf(r, v.length + r.length + s.length);
System.arraycopy(s, 0, signByte, r.length, s.length);
System.arraycopy(v, 0, signByte, r.length + s.length, v.length);
return Numeric.toHexString(signByte);
}
验签代码
public static Boolean validate(String signature, String content, String walletAddress) throws SignatureException {
if (content == null) {
return false;
}
byte[] msgHash = content.getBytes();
byte[] signatureBytes = Numeric.hexStringToByteArray(signature);
byte v = signatureBytes[64];
if (v < 27) {
v += 27;
}
Sign.SignatureData signatureData = new Sign.SignatureData(
v,
Arrays.copyOfRange(signatureBytes, 0, 32),
Arrays.copyOfRange(signatureBytes, 32, 64));
BigInteger publicKey = Sign.signedPrefixedMessageToKey(msgHash, signatureData);
String parseAddress = "0x" + Keys.getAddress(publicKey);
return parseAddress.equalsIgnoreCase(walletAddress);
}