代码之家  ›  专栏  ›  技术社区  ›  Joel Pou

如何为java指定签名长度。安全签名签名方法

  •  2
  • Joel Pou  · 技术社区  · 7 年前

    对于我的应用程序,我试图使用java对一些字节内容进行签名。安全签名类。我遇到的问题是,签名永远不会以固定长度生成。例如,有时生成的长度为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;
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    4 年前

    对于ECDSA Java crypto使用 ASN。1 DER编码 X9.62、SEC1和 rfc 3279 sec 2.2.3 哪一个 长度略有不同 . 这将在另一个堆栈中详细介绍: 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支持签名和加密)是给定密钥的固定长度,如PKCS1中I2OS和OS2I所定义。

    如果您需要不同的编码,例如PKCS11使用的固定长度编码(并且您的提供者名称“SC”表明可能存在这种情况),则必须对其进行转换。

    2019-10年新增: 您不再需要自己在Java中完成它;自1.61(2019-02)起的BouncyCastle 正确地 支持这一点,Java 9 up(2018-12)中的SunEC也支持这一点。请参阅后面的“复制”部分 Java ECDSAwithSHA256 signature with inconsistent length .