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

Signing with javax.crypto.Cipher vs java.security.Signature

我正在处理一些需要更新以使用其他加密提供程序的旧代码。我不是 Java 专家。我试图了解使用 javax.crypto.Cipherjava.security.Signature.

签署哈希之间的区别

现有代码与此类似:

  Cipher cipher = Cipher.getInstance(CFG_ALGO);
  cipher.init(Cipher.DECRYPT_MODE, privateKey);
  byte[] signature = cipher.doFinal(payload);

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

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

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

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

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

这是不是所有签名方案的情况,但是,例如DSA 和 ECDSA 的工作方式完全不同。

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