当前位置: 首页 > 面试题库 >

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

仲孙俊贤
2023-03-14
问题内容

对于我的应用程序,我试图使用java.security.Signature类对一些字节内容进行签名。我遇到的问题是签名永远不会以固定的长度生成。例如,有时会以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/为什么openssl椭圆曲线数字签名相差一个字节

*

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

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

2019-10新增: 您不再需要用Java自己做; 从1.61(2019-02)开始的BouncyCastle 正确地 支持此功能,Java 9
up(2018-12)中的SunEC也是如此。请参阅稍后的长度不一致的近重复JavaECDSAwithSHA256签名。



 类似资料:
  • 问题内容: ECDSA算法中256位EC密钥的签名长度将是多少?我想验证签名长度是否相同。如果某个机构可以帮助我设置一个EC钥匙,那将是很棒的。 问题答案: 这取决于您如何对签名进行编码。这是OpenSSL的代码段,用于测量DER格式的ECDSA签名的长度。 以prime256曲线上的EC_KEY作为参数的上述函数的结果是 sig_len在哪里。 您需要使用位EC密钥的字节来进行DER编码的ECD

  • 本文向大家介绍android实现给未签名的apk签名方法,包括了android实现给未签名的apk签名方法的使用技巧和注意事项,需要的朋友参考一下 android给未签名的apk签名命令。 准备文件 1、unsign.apk(未签名的apk) 2、shanhy.keystore(签名证书文件) 命令语法: jarsigner -verbose -keystore [keystorePath] -s

  • Pushes 签名 git push can be instructed to sign the push. The server may use this to control the execution of certain hooks: git push 可以被指示进行签名 push。服务器可以使用它来控制一些钩子的执行: ❯ git push --signed Github 现在貌似并没有

  • Merges 签名 git merge 命令可以在合并没有使用 --verify-signatures 命令带有不可信 GPG 签名的 commit/branch 时检查和拒绝 如果被合并的分支中有任何没有被有效签名认证的提交,合并将不会继续。 Merge commit 本身也是可以被签名的(使用 -S): ❯ git checkout -b enhancement/foo ❯ touch qux

  • Commits 签名 在上文提到的 git 仓库中添加一个新文件,并使用 -S 标签来提交(commit)它。(注意不是 -s 标签,在 commit 命令下它意味着 Signed-Off): ❯ touch biz ❯ git add biz ❯ git commit -S -m "Add biz" 你可以通过在 ~/.gitconfig.local 文件中添加下列内容来开启 commit 自动

  • Tags 签名 假设你有一个额外的文件可以在主 ~/.gitconfig 中添加 gitconfig 设置: [include] path = .gitconfig.local 配置 ~/.gitconfig.local 文件让其指向你插入的 GPG 签名钥匙: [user] signingkey = <signingKeyId> 开启 git tag -m <message> 来