在对一些加密代码进行故障排除时,我看到了奇怪的堆栈跟踪层次结构。我已经解决了原来的问题,但对如何生成这样的堆栈跟踪感到好奇。谁能帮我解答一下吗?
请注意,我无法逐字复制粘贴堆栈跟踪。我必须删除可能暴露专有代码的框架。
businesscode.BusinessException: Failed while generating session key
at businesscode.businessthing.BusinessMethod(BusinessApp.java:NN)
... NN more
Caused by: java.security.NoSuchProviderException: JCE cannot authenticate the provider XXX
at javax.crypto.SunJCE_b.a(DashoA13*..)
at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
at businesslib.generateKey(BusinessLib.java:NN)
... NN more
Caused by: javax.util.jar.JarException: Cannot parse X.jar
at javax.crypto.SunJCE_c.a(DashoA13*..)
at javax.crypto.SunJCE_b.b(DashoA13*..)
at javax.crypto.SunJCE_b.a(DashoA13*..)
... 25 more
为什么方法名称如a和b(SunJCE_c.a、SunJCE_b.b)和文件/行信息如DashoA13*?
Oracle Java 6 32 位,在 64 位 Linux 和 32 位 Windows 上运行。
这是否是因为某些信息不可用(可能是由于运行时优化)?还是故意混淆视听? JNI?
导致此问题的问题是第三方加密提供程序错误地打包在 jar 文件中。
编辑:最初的问题(NoSuchProviderException:JCE无法验证提供程序...
)是由一个天真的构建过程引起的,该过程从原始jar中提取加密提供程序类并将它们重新打包到一个新的原始jar中 - 但没有所需的签名信息。
感谢 Siva 和 owlstead 提醒我签名 jar :)
最佳答案
这里有几个选项(我假设在此之前签名已经验证):
- 用于生成签名的证书/私钥现已过期;
- 签名与较新版本的 Oracle Java 运行时不兼容;
.jar
内容的签名已删除或内容/签名已更改。
至于那些奇怪的名字;这些名称是已使用代码混淆器进行混淆的类的名称。它们不是公共(public) API 的一部分,因此您没有理由知道其中的内容。它们包含验证签名的代码,因此与安全相关。
关于Java 加密提供程序 - 奇怪的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078602/