使用 RSASSA-PKCS1-V1_5 使用私钥对有效负载进行数字签名

Digitally sign the payload with Private Key using RSASSA-PKCS1-V1_5

我正在尝试插入并实现以下语句。

Digitally sign the payload with Private Key using RSASSA-PKCS1-V1_5 signature scheme and SHA1 cryptographic hash function.

注意:请参阅 PKCS #1 v2.1:PKCS1-v1.5 签名和加密方案的 RSA 加密标准规范。

当它说 "and" 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;

}

我将不胜感激任何提示,如果适用,如果我使用第二个选项,我该如何验证签名。

谢谢

第一个选项有意义,第二个选项意义不大;您将需要第一个选项:仅使用 SHA1withRSA.

计算哈希是签名生成操作的一部分。签名生成操作允许您配置 特定哈希的签名操作,例如SHA-1 或 SHA-256。这就是您在指定 SHA1withRSA 时所做的事情。它使用 PKCS#1 v1.5 填充是 隐式 因为在他们编写函数时只有一种方案被广泛标准化。

在您的第二段代码中,您对签名进行了哈希处理。这很有趣,但它不允许您使用 public 密钥验证签名。这就是您首先生成签名的原因。请注意,如果您使用不同的不确定性签名方案(例如 PSS),那么您每次都会获得不同的哈希值,从而使您的第二个方案完全无用。


请注意,通常 SHA-1 不再被认为是安全的,签名生成尤其如此。只有当签名算法(和底层哈希算法)的输入受到限制时,它仍然可以被认为是安全的。