如何为 java.security.Signature Sign 方法指定签名长度



对于我的应用程序,我正在尝试使用java.security.Signature class对一些字节内容进行签名。我遇到的问题是签名永远不会以固定长度生成。例如,有时它的长度为 135、136 或 137 字节。有没有办法在末尾指定长度或一些填充?任何其他想法或意见不胜感激。

private byte[] ecdsaSign(ECPrivateKey key, byte[] content) throws Exception {
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "SC");
ecdsaSign.initSign(key);
ecdsaSign.update(content);
byte[] signature = ecdsaSign.sign();
return signature;
}

对于ECDSA Java,加密使用由X9.62,SEC1和rfc 3279 sec 2.2.3标准化的ASN.1 DER编码其长度略有不同。这在另一个堆栈中有更详细的介绍:https://crypto.stackexchange.com/questions/1795/how-can-i-convert-a-der-ecdsa-signature-to-ASN.1 和 https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103 和 https://crypto.stackexchange.com/questions/37528/why-do-openssl-elliptic-curve-digital-signatures-differ-by-one-byte

DSA也是如此,但RSA则不然,RSA的签名(以及密码,因为RSA同时支持签名和加密)对于给定密钥是固定长度的,如PKCS1中的I2OS和OS2I所定义。

如果需要不同的编码,例如 PKCS11 使用的固定长度编码(并且提供程序名称"SC"表明了这种可能性),则必须对其进行转换。

添加了 2019-10:您不再需要在 Java 中自己做;BouncyCastle 自 1.61 (2019-02) 以来正确支持这一点,Java 9 更高版本中的 SunEC 也是如此(2018-12)。请参阅后面的近似重复的 Java ECDSA与 SHA256 签名,长度不一致。

最新更新