1

在對某些加密代碼進行故障診斷時,我看到了一個奇怪的堆棧跟蹤層次結構。我已經解決了原始問題,但對如何生成這樣的堆棧跟蹤感到好奇。任何人都可以啓發我嗎?Java加密提供程序 - 奇怪的堆棧跟蹤

請注意,我不能複製粘貼堆棧跟蹤逐字。我必須關閉可以暴露專有代碼的框架。

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 cannot authenticate the provider...)是由一個天真的構建過程造成的,該過程從原始jar中提取加密提供程序類,並將它們重新打包在新的原始jar中 - 但沒有所需的簽名信息。 感謝Siva和owlstead提醒我簽名罐子:)

回答

1

這裏有幾個選項(和我假設在這之前簽名並驗證):這是用來生成簽名

  1. 證書/私鑰是已經過時的;
  2. 該簽名與較新版本的Oracle Java運行時不兼容;
  3. 刪除了.jar內容的簽名或更改了內容/簽名。

至於奇怪的名字;這些名稱是使用代碼混淆器進行了混淆的類的名稱。這些不是公共API的一部分,所以你沒有理由知道這些內容。它們包含驗證簽名的代碼,因此與安全性相關。

+0

請注意,如果.jar文件不包含任何簽名,它們可能在OpenJDK/JRE上運行,但不在Oracle JDK/JRE上運行。 –

+0

謝謝,貓頭鷹。發生的事情是一個天真的工具從提供的(簽名,有效的)提供程序jar中提取所有類,並將它們打包在一個新的jar中 - 不包括原始META-INF /中的所有信息。 您對混淆的確認是我想要的。 – Ishan

+0

添加第三個理由給我的回覆,很高興你發現問題,謝謝接受。 –

0

您的第三方cryto提供商應簽署所有的jar文件,尤其是提供者jar。這個簽名應該被SUN(現在的oracle)信任。

+0

謝謝,Siva。這樣可以更清楚地解釋原始問題 - 配置錯誤的構建過程從提供程序jar中提取所有類,並將它們(與其他庫中的其他類一起)捆綁到新jar中 - 破壞簽名。 仍然 - 爲什麼「奇怪」stacktrace? – Ishan

+0

沒有解決OP的問題。可以添加爲評論嗎? –

0

它不是一個橢圓形調用簽名(可變參數數)嗎?

+0

是的,它看起來非常像 - 但在這裏我期望看到文件:行信息 - 正如你可以在我輸入的一個示例行(BusinessLib.java:NN)中看到的那樣。 – Ishan