使用 javax.crypto.Cipher 与 java.security.Signature 进行签名

qui*_*inz 2 java cryptography jce digital-signature jca

我正在编写一些旧代码,需要更新它才能使用另一个加密提供商。我不是 Java 专家。我试图了解使用javax.crypto.Cipher和签署哈希值之间有什么区别java.security.Signature

现有代码类似于:

  Cipher cipher = Cipher.getInstance(CFG_ALGO);
  cipher.init(Cipher.DECRYPT_MODE, privateKey);
  byte[] signature = cipher.doFinal(payload);
Run Code Online (Sandbox Code Playgroud)

我收到的使用新提供程序的示例片段如下所示:

  final Signature sign = Signature.getInstance("RSA", SIGNATURE_PROVIDER);
  sign.initSign(keystore.getPrivateKey(keyName, keyPass));
  sign.update(data);
  byte[] signature = sign.sign();
Run Code Online (Sandbox Code Playgroud)

如果我为两者使用相同的提供商,两者之间有什么区别吗?一种方式通常优于另一种方式吗?

mkl*_*mkl 7

Cipher用于加密和解密;Signature用于签名和验证。

在某些情况下Cipher也可以在签名上下文中使用的唯一原因是,某些签名方案通过使用私钥加密指纹来工作,以便其他有权访问相应公钥的人可以解密数据并进行验证。

但并非所有签名方案都是如此,例如 DSA 和 ECDSA 的工作方式完全不同。

因此,即使您当前仅使用 RSA 签名,Signature为了以后的可维护性,您也应该使用。