如何在java SHA 256算法中使用客户端数字签名对给定数据进行哈希



我们希望使用java-sha 256位哈希算法,使用客户端数字签名对数据进行哈希。

我们如何在java中进行哈希时添加数字签名。

如果我理解正确,您需要对一些数据进行签名。下面是一个示例方法:

public static String encode(String dataToEncode, String secret) throws InvalidKeyException, NoSuchAlgorithmException {
byte[] decodedSecret = Base64.getDecoder().decode(secret);
SecretKeySpec keySpec = new SecretKeySpec(decodedSecret, "HmacSHA256");
Mac sha256 = Mac.getInstance("HmacSHA256");
sha256.init(keySpec);
return Base64.getEncoder().encodeToString(sha256.doFinal(dataToEncode.getBytes()));
}

密钥是Base64编码的密钥。该方法返回数据的Base64编码哈希。Base64部分是可选的,如果不需要编码,可以将其删除。这是我在对加密交易所的REST API调用进行签名时使用的方法。

以下解决方案通过应用RSA PKCS#8格式的私钥对字符串进行签名。如果您的代码已经从pem文件中读取了私钥作为文本,该文件看起来像以下示例:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRxFWXGYDG8zKw
ihIS+Ydh/nWX9NwkFTKMRjH8BQ78ZEnXrnGJHvd+dI+zEiRo7rLuDXMOjsnhIR/O
....
+wqssDAApq+CiPcBnn0x2Vw=
-----END PRIVATE KEY-----

然后,您需要去掉第一行和最后一行以及所有换行符('\n'(。如果您的privateKey是读取的(例如从java密钥库(,您可以删除将私钥字符串转换为java.security.PrivateKey对象的代码行。

private static String signSHA256RSA(String inputStr, String inputKey) throws Exception {
String key = inputKey.replaceAll("-----END PRIVATE KEY-----", "")
.replaceAll("-----BEGIN PRIVATE KEY-----", "")
.replaceAll("n", "");
byte[] keyBytes = Base64.getDecoder().decode(key);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(spec);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(inputStr.getBytes("UTF-8"));
byte[] s = signature.sign();
return Base64.getEncoder().encodeToString(s);
}

最新更新