java - 为什么我的 Java 私钥签名与我的 Openssl 签名不匹配?
问题描述
因此,我从 Java 获得的签名与我在 openssl 中获得的签名不匹配。这是我正在做的一个例子:
在使用 openssl 的终端中,我正在这样做。
echo +pkCdYME5SzI7A2PV0r8/8FqYGZyvTp+4DoGkdaMYRs= hash
openssl dgst -sha256 -sign "private.key" -out hash.sha256 hash
base64 < hash.sha256 > hash.bin
cat hash.bin
results posted below
Java 代码:(哈希与我用于 openssl 的哈希匹配)
private String createSignature(String hash) throws ProductException {
try {
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(getPrivateKey());
privateSignature.update(hash.getBytes(UTF_8));
byte[] signature = privateSignature.sign();
String result = Base64.encodeBase64String(signature);
System.out.println(result); //THIS RESULT SHOULD MATCH BUT DOESN'T
return result;
} catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException e) {
throw new ProductException(Codes.AUTHENTICATION_ERROR, e);
}
}
private PrivateKey getPrivateKey() throws ProductException {
try {
String key = IOUtils.toString(this.getClass().getResourceAsStream("private.key"));
PemObject pem = new PemReader(new StringReader(key)).readPemObject();
byte[] content = pem.getContent();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(content);
return keyFactory.generatePrivate(ks);
} catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new ProductException(Codes.AUTHENTICATION_ERROR, e);
}
}
请帮忙!我已经搜索了互联网,但我不知道我做错了什么。
My openssl signature = O8DRek17ySzz+p2N8brH/9CdY3b+GN5bnyaTtn+ZP3SDIBvtqkk/lp+zb1BZ80a6xCIID8CTjNU+/svrV/q/rXEqEQc3jk3ZVUo0RJB52rgW26EQWyieAdqRlIbQqPhaCIrpWrs+WImGk7cPnkTEueIm+EzxG8ptjF5cAZH3lustVLt8SM9sXjQJzxzMgF2g0XN+1GQniAdWT/oNJXv0ZG7PSFACfcoSTSdN4wHkVAG4/PF/d6H+M5eTkEu6NhXfbfBBtavGmBiDgM6FPFDJ4r+2Rzvc/vpSiglUUQgxD58PTH47Y8xMc4t4/yahrchi2if2cJ7e89RBb1IHNus+eB8zPS0MHBn2OWDUM66P1KRanwzebDfg08VhRbW8zVnmNUNzXxAdCWa3kwsDe7hx+36oHfJwoyqIFwjJi8TKZm0JLKMf0SaLh/6zK0bIdgoXw23AfJni1ewmUqZbpE6Q4A0TgxaJg1aozb06l7Nb523FqV6ScRZ0wJK3s51Dduy5j1V1jt0+ YYd+0zACyYfr5a+vypEygzsZ2Rzu3Q/l4VoPlZF2dr50TLnbhTvFnyK9mvc0zaTmsuHI5UJAbcpFBTXiDWb0DoWo4PkHRVFPvIMai37UxW4c5V0ybchlQHrEKYQ8NigYHGX5j8GsFhZJgg73Het1YWk
My Java Signature = 8dKc1otqL+thKQ7yTPeHX7T5fuOgv6PmHvlP5QyEHEXZILwD/234polMSs20i4na9wCuUdcSA+mHEKpY7Dkyd8VLTcZZ8RC8AlPE5bvzXc/uZhyPpBuSA7mDDOARbg3mx5usq4ythdqxj6OvdOBAJXXFB6Jc/c1XVd8IxDnRJoz5MlwxZIp94TAyW11QbMGNZuzcbsdEdsBuXU1MR4gzVfMLJjMcIM3YTtsP3bktsPAs5W2Asp9lDg5GuIOgWgXpTlj3VY6NF64SCI1tY4LhE7zq16YXQ6ykJ490YSVX5J9z+cDvZcVgfvgKCZuk4wgnXo6PbE4Wm4FDuzu35DEQi9Y5EEHzXlb5aNFQP3S6lumyfqOCmZlQcNVS53ur1fY4P8cnOuHZelyYS1Dw54q0SDCjFuANK2Ltl8rIZOZQWbg6jo45HbpaHUgt1NMkmj/UC/rLSnofa/YYbcJ2YZbqUdyX/yTBlzEuLR0/4Bgv9zvBw8HI0h3icv7/1NYaKo/eBSki6HNyDh2pDWX6IHQTFMzdFKeoXVAQLfaJREIpMPu+rDExI6Ozl0r9D61fY+XtMrptGNTFzf1h4cwUAZAC737Ahc6qsr+jQkDWDJt6oJbgziNE4C2JZriRtvRDACpryt6MGH1QnYPGYfCVs/xSxaYEtGJsjRRkG+lkpojcJ+A=
解决方案
您的问题很可能来自echo
用于准备签名功能的输入。默认情况下,echo
无论其输出是什么,都会添加一个换行符,并且表示它的字节会弄乱签名。
尝试echo -n
跳过换行符,看看它是否有效。
推荐阅读
- mongoose - 如何使用 Jest 在 NestJS 的提供者中模拟和监视“mongoose.connect”
- google-cloud-platform - Cron 作业中的请求方法
- r - R ggplot水平条形图与千数据
- c# - 当部署在 linux 服务器上时,mongodb 客户端连接在 .net 核心中需要 15 分钟,但在 Windows 服务器上部署时同样工作正常
- swift - [self] 如何在 Swift 上工作?它的工作方式类似于 [unowned self] 或强参考
- javascript - Javascript Vue:onFileChange(e)中的变量'e'来自哪里?
- python - AWS 获取 AWS 文本代码上的关键错误。我应该怎么办?
- orbeon - 以 orboen 形式在数据库中为 datepicker 存储禁用日期
- regex - 正则表达式从中获取价值
通过对值断言条件 - java - 我可以强制使用具有泛型但在方法定义类型中的方法参数吗?