我试图插板并实施以下声明。
使用私钥对有效负载进行数字签名 RSASSA-PKCS1-V1_5 签名方案和 SHA1 加密哈希函数。
注意:请参阅PKCS#1 v2.1:PKCS1-v1.5签名和加密方案的RSA加密标准规范。
当它说"和#34;时我很困惑。 sha1哈希函数,下面是采用的代码,我不确定它是否是正确的解释
public String getSignature(String _plainTextMessage,PrivateKey privateKey){
try {
Signature signer = Signature.getInstance("SHA1withRSA");
signer.initSign(privateKey);
signer.update(_plainTextMessage.getBytes());
byte[] signature = signer.sign();
return new BASE64Encoder().encode(signature);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
或者我是否需要包含MessageDiget,如下所示
public String getSignature(String _plainTextMessage,PrivateKey privateKey){
try {
Signature signer = Signature.getInstance("SHA1withRSA");
signer.initSign(privateKey);
signer.update(_plainTextMessage.getBytes());
byte[] signature = signer.sign();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] digest = sha1.digest(signature);
return new BASE64Encoder().encode(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
我将感谢任何提示,如果适用,如果我使用第二个选项,我如何验证签名。
感谢
答案 0 :(得分:0)
第一个选项有意义,第二个选项没什么意义;您需要第一个选项:只使用SHA1withRSA
。
计算哈希是签名生成操作的一部分。签名生成操作允许您配置特定哈希的签名操作,例如SHA-1或SHA-256。这是您指定SHA1withRSA
时执行的操作。它正在使用PKCS#1 v1.5填充隐式,因为在他们编写函数时,只有一个被广泛标准化的方案。
在你的第二段代码中,你勾勒出签名。这很有趣,但它不允许您使用公钥验证签名。这就是为什么你首先要生成签名的原因。请注意,如果您使用不同的不确定签名方案(如PSS),则每次都会获得不同的哈希,使第二个方案完全无效。
请注意,通常SHA-1不再被认为是安全的,特别是签名生成的情况。只有当signatue算法(和底层哈希算法)的输入受到限制时,它才能被认为是安全的。