2016-10-10 113 views
2

我想運行fortify爲我的java代碼,我無意中遇到了以下錯誤。你能幫助別人嗎?Fortify密碼加密錯誤密碼getInstance方法

High Priority: An instance of Cipher.getInstance was found. EncryptionUtils.java:137 (Unconditional: Bad Crypto) [83299E2C-B5DB-45F2-8CFE-01F3E6C0C02D] 55E277C045A4A6E410FCBF9BA5125E3E

代碼行中,我得到這個錯誤

final Cipher aesCBCCipher = Cipher.getInstance("AES/GCM/Nopadding");

+0

你爲什麼指定'Nopadding'? – Robert

+0

我嘗試了'NoPadding'和'PKCS5Padding'。但都導致了相同的例外。我只是使用了與問題中鏈接提到的相同的密碼轉換。 –

回答

0

這可能是因爲這兩種填充或改造的發生。如果您沒有指定轉換,那麼默認的ECB將假定爲Java和Android,並且Fortify認爲這並不安全。

我被指定有同樣的問題:

final Cipher cipher = Cipher.getInstance("AES"); 

Fortify的停止抱怨,當我把它改成如下:

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

Here,你可以找到轉換的列表中,每個JVM需要支持。例如,Android支持的版本爲here

我懷疑你得到的錯誤是因爲使用GCM需要額外的步驟(如果它們沒有提供,Cipher可能會默認採用另一種轉換 - 我沒有證實這一點)。請參閱Java docs的以下摘錄:

AEAD模式(如GCM/CCM)在開始密文真實性計算之前執行所有AAD真實性計算。爲避免必須在內部緩衝密文的實現,在處理密文(通過更新和doFinal方法)之前,必須將所有AAD數據提供給GCM/CCM實現(通過updateAAD方法)。

如果您使用分析結果打開Fortify Audit Workbench,那將會給您提供有關您的問題的更多詳細信息和見解。