[英]How to Hash a given data using clients digital signature in java SHA 256 Algorithm
我们希望 Hash 使用 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编码的hash数据。 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
ZA8CFDE6331BD59EB2AC96F8911ZB4 的代码行。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.