当前位置: 首页 > 知识库问答 >
问题:

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

楚修为
2023-03-14

利用RSASSA-PKCS1-V1_5签名方案和SHA1密码哈希函数,用私钥对有效载荷进行数字签名。

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

当它说“和”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;
}
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;

谢谢

共有1个答案

徐英锐
2023-03-14

第一个选择有意义,第二个选择几乎没有意义;您将需要第一个选项:只需使用SHA1WITHRSA

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

在第二段代码中,您将对签名进行散列。这很有趣,但它不允许您使用公钥验证签名。这就是为什么你一开始就生成签名。请注意,如果您使用不同的不确定性签名方案,如PSS,您将得到不同的哈希每次,使您的第二个方案完全无用。

 类似资料:
  • 我不确定我是应该在这里问这个问题,还是在安全交换中问这个问题。 无论如何,我最近正在使用TPM处理RSA签名,遇到了一个问题,我将填充方案从RSASSA-PKCS1-v1_5切换到RSASSA-PSS。我认为这应该不会有什么不同,但我注意到一个例子在TSS. MSR(。NET TPM库)不再起作用。我在https://github.com/microsoft/TSS.MSR/issues/109.

  • 我正在使用jose-jwt库,并希望使用RS256加密算法在C#中创建一个有签名的JWT。我对密码学没有经验,所以请原谅我的无知。我在文档中看到以下示例: 它显示了文件的使用,但是如何使用下面表单的RSA密钥文件呢?我正在查看X509Certificate2的文档,但我看不到RSA私钥的选项。它似乎只接受,我认为这是公钥。 最后,文档中列出的两个选项之间的区别是什么?我如何在这两个选项之间进行选择

  • 有没有办法使用openssl对x509证书或任何文档进行数字签名?

  • 我们正在通过RESTful API与Google进行集成,我需要用RSA-SHA256对JWT的有效负载进行签名,我所拥有的只是一个字符串形式的私钥,看起来像 我一直在到处寻找解决方案,但每个人都在谈论,它需要一个p12文件或一些证书。现在我没有这两个,我只有一个字符串作为私钥。 谷歌推荐https://jwt.io/它与键字符串一起工作,但是我需要我的代码来完成它。页面中列出了3个库: 其中一个

  • 我需要签署一条消息以提交到远程服务(通过websocket)。为此,我需要基于整数(我的用户id)和密码短语(base64编码字符串)构造私钥。,使用SHA224散列。我正在使用golang和crypto/ecdsa以及用于字节编码等的附带软件包。 以下是我的文档: 签名使用椭圆曲线数字签名算法(ECDSA)编码的消息,其中包含:用户ID、服务器Nonce、客户端节点和私钥。使用SHA224散列生