BouncyCastle - 为算法设置自定义别名
BouncyCastle - set custom alias to algorithm
我正在尝试使用 Bouncy Castle 验证签名摘要。
摘要算法为SHA1.
不幸的是,摘要算法在签名中设置为 SHA1WITHRSA(这不是摘要算法)而不仅仅是 SHA1。
对此我无能为力
现在我需要告诉 Bouncy Castle 在遇到 SHA1WITHRSA 作为摘要算法时使用 SHA1。
是否可以添加导致 SHA1 摘要算法的别名?
我试过这个:
BouncyCastleProvider bcp = new BouncyCastleProvider();
bcp.put("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.put("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
Security.addProvider(bcp);
MessageDigest.getInstance("SHA1WITHRSA", "BC"); // throws an exception
MessageDigest.getInstance("1.2.840.113549.1.1.5", "BC"); // throws an exception
但是没有成功..
我得到 java.security.NoSuchAlgorithmException.
完整堆栈在这里:
no such algorithm: SHA1WITHRSA for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: SHA1WITHRSA for provider BC
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.Security.getImpl(Security.java:698)
at java.security.MessageDigest.getInstance(MessageDigest.java:227)
at com.company.Main.testAddDigest(Main.java:82)
at com.company.Main.main(Main.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
1.2.840.113549.1.1.5 也一样
no such algorithm: 1.2.840.113549.1.1.5 for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: 1.2.840.113549.1.1.5 for provider BC
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.Security.getImpl(Security.java:698)
at java.security.MessageDigest.getInstance(MessageDigest.java:227)
at com.company.Main.testAddDigest(Main.java:95)
at com.company.Main.main(Main.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
没有这样的摘要算法SHA1WITHRSA,这使得抛出异常是正确的。
但我认为通过添加 "put" 行,将添加别名,然后 SHA1WITHRSA 将被识别为 SHA1 摘要算法。
更新: 当我使用 Provider 的特定实例时它正在工作:
MessageDigest.getInstance("SHA1WITHRSA", bcp);
我不确定如何将别名一般添加到 BC 的所有实例,而不仅仅是创建的 bcp 变量 (BouncyCastleProvider)。如果可能的话。
要验证签名,只需使用此代码
Signature sig = Signature.getInstance("SHA1withRSA", "BC");
sig.initVerify(publicKey);
sig.update(data)
boolean verifies = sig.verify(sigToVerify);
您混淆了签名算法和摘要算法。 SHA1withRSA
是一种签名算法。表示数字签名操作对数据进行SHA1
摘要算法哈希,然后进行RSA
加密
因此 MessageDigest.getInstance("SHA1WITHRSA", "BC");
上的 java.security.NoSuchAlgorithmException
是预期的行为,因为 SHA1withRSA
不是摘要算法
已编辑
如果想了解签名算法的摘要算法,可以使用BouncyCastle的查找器。
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find(signatureAlgorithm);
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
String digestAlgOID = digAlgId.getAlgorithm().getId();
MessageDigest.getInstance(digestAlgOID);
所以,我想通了。
我不确定是否有人会遇到这样的情况,但是..
问题是我在玩 DSS(https://github.com/esig/dss,处理数字签名的框架)。
它使用 Bouncy Castle。
我在一个特定的 PDF 上测试它,它的摘要算法属性设置为 SHA1withRSA
(这是不正确的,应该只有 SHA1
)。
但任务是处理它,因为它设置了正确的值 - SHA1
.
所以我需要告诉充气城堡在遇到 SHA1withRSA
设置为摘要算法时使用 SHA1
。
我不想过多地修改框架代码(理想情况下根本不想),我当然也不想修改任何 Bouncy Castle 代码。
下面的代码解决了它:
BouncyCastleProvider bcp = (BouncyCastleProvider)Security.getProvider("BC");
bcp.addAlgorithm("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.addAlgorithm("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
每当 SHA1WITHRSA
或 1.2.840.113549.1.1.5
被设置为摘要算法(它们不是!)时,它获取 Bouncy Castle 提供程序并添加两个别名路由到 SHA-1 摘要算法。
可以说这样的 PDF 不应该被验证,但那是另一回事..
我正在尝试使用 Bouncy Castle 验证签名摘要。 摘要算法为SHA1.
不幸的是,摘要算法在签名中设置为 SHA1WITHRSA(这不是摘要算法)而不仅仅是 SHA1。
对此我无能为力
现在我需要告诉 Bouncy Castle 在遇到 SHA1WITHRSA 作为摘要算法时使用 SHA1。
是否可以添加导致 SHA1 摘要算法的别名?
我试过这个:
BouncyCastleProvider bcp = new BouncyCastleProvider();
bcp.put("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.put("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
Security.addProvider(bcp);
MessageDigest.getInstance("SHA1WITHRSA", "BC"); // throws an exception
MessageDigest.getInstance("1.2.840.113549.1.1.5", "BC"); // throws an exception
但是没有成功.. 我得到 java.security.NoSuchAlgorithmException.
完整堆栈在这里:
no such algorithm: SHA1WITHRSA for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: SHA1WITHRSA for provider BC
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.Security.getImpl(Security.java:698)
at java.security.MessageDigest.getInstance(MessageDigest.java:227)
at com.company.Main.testAddDigest(Main.java:82)
at com.company.Main.main(Main.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
1.2.840.113549.1.1.5 也一样
no such algorithm: 1.2.840.113549.1.1.5 for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: 1.2.840.113549.1.1.5 for provider BC
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.Security.getImpl(Security.java:698)
at java.security.MessageDigest.getInstance(MessageDigest.java:227)
at com.company.Main.testAddDigest(Main.java:95)
at com.company.Main.main(Main.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
没有这样的摘要算法SHA1WITHRSA,这使得抛出异常是正确的。 但我认为通过添加 "put" 行,将添加别名,然后 SHA1WITHRSA 将被识别为 SHA1 摘要算法。
更新: 当我使用 Provider 的特定实例时它正在工作:
MessageDigest.getInstance("SHA1WITHRSA", bcp);
我不确定如何将别名一般添加到 BC 的所有实例,而不仅仅是创建的 bcp 变量 (BouncyCastleProvider)。如果可能的话。
要验证签名,只需使用此代码
Signature sig = Signature.getInstance("SHA1withRSA", "BC");
sig.initVerify(publicKey);
sig.update(data)
boolean verifies = sig.verify(sigToVerify);
您混淆了签名算法和摘要算法。 SHA1withRSA
是一种签名算法。表示数字签名操作对数据进行SHA1
摘要算法哈希,然后进行RSA
加密
因此 MessageDigest.getInstance("SHA1WITHRSA", "BC");
上的 java.security.NoSuchAlgorithmException
是预期的行为,因为 SHA1withRSA
不是摘要算法
已编辑
如果想了解签名算法的摘要算法,可以使用BouncyCastle的查找器。
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find(signatureAlgorithm);
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
String digestAlgOID = digAlgId.getAlgorithm().getId();
MessageDigest.getInstance(digestAlgOID);
所以,我想通了。
我不确定是否有人会遇到这样的情况,但是..
问题是我在玩 DSS(https://github.com/esig/dss,处理数字签名的框架)。
它使用 Bouncy Castle。
我在一个特定的 PDF 上测试它,它的摘要算法属性设置为 SHA1withRSA
(这是不正确的,应该只有 SHA1
)。
但任务是处理它,因为它设置了正确的值 - SHA1
.
所以我需要告诉充气城堡在遇到 SHA1withRSA
设置为摘要算法时使用 SHA1
。
我不想过多地修改框架代码(理想情况下根本不想),我当然也不想修改任何 Bouncy Castle 代码。
下面的代码解决了它:
BouncyCastleProvider bcp = (BouncyCastleProvider)Security.getProvider("BC");
bcp.addAlgorithm("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.addAlgorithm("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
每当 SHA1WITHRSA
或 1.2.840.113549.1.1.5
被设置为摘要算法(它们不是!)时,它获取 Bouncy Castle 提供程序并添加两个别名路由到 SHA-1 摘要算法。
可以说这样的 PDF 不应该被验证,但那是另一回事..