1. 程式人生 > >Google與SHA1雜談-在開發中規避低強度加密演算法!

Google與SHA1雜談-在開發中規避低強度加密演算法!


Google的研究人員剛剛創造了計算機加密學在2017年的第一個里程碑:他們攻破了SHA-1安全加密演算法。

這確實是一個里程碑,其實很早之前Google就已經制定規則停止SHA1的使用了。

安全加密演算法其實是所有開發團隊都需要重視的問題之一,蓋因低強度的加密演算法太過於容易被攻破,而底層的密碼演算法被攻破直接代表著上層應用的土崩瓦解。

再來說說什麼是碰撞,不得不提山東大學的王小云教授和MD5演算法。

從根本上講,MD5演算法是一種摘要演算法,它可以從多個位元組組成的串中計算出由32個位元組構成的“特徵串”。對於超過32位元組的串來說,MD5計算得出的值必然是其一個子集,所以必然存在兩個(或更多)不同的串能夠得出相同MD5值的情況。這種情況就叫做MD5碰撞。

王小云教授的貢獻在於她找到了一種方法,可以在已知原文的情況下構造出另一個跟原文MD5值相同的串。並且該計算過程所消耗的時間是有限的、可計算的。

從這一點來說,MD5方法確實已經不可靠了。說得俗一點:你可以將某個檔案的MD5值弄的跟Word.exe的完全一樣。但是你卻無法讓這個檔案包含你所希望的某種功能。


話題回到研發流程中,如何避免使用低強度的加密或者雜湊演算法?研發團隊雖然不敏感,但Coverity已經提供了自動化的程式碼靜態分析檢測規則:RISKY_CRYPTO

RISKY_CRYPTO 可查詢使用容易遭到加密攻擊或存在其他風險的加密演算法的情況。示例包括使用根據當前標準較弱的舊版演算法,以及特定演算法的不當使用。

RISKY_CRYPTO 的預設策略包括以下規則:

• 不應使用 DES 演算法。該演算法已過時,具有先進硬體的攻擊者只需數日即可破解 DES 加密。這相當於以下檢查器選項:forbid:DES|PBEMD5DDES/*/*/*

• 不應在未使用隨機 padding 的情況下使用 RSA 演算法。缺少隨機 padding 可讓攻擊者破解此加密,例如使用 Coopersmith’s Attack。這相當於以下檢查器選項:forbid:RSA/*/NOPD/*

• 不應使用 ECB 塊模式。如果兩塊純文字相同,且這兩塊使用相同金鑰加密,則這兩塊的密文也將相同。這將洩漏有關基礎資料的資訊。這相當於以下檢查器選項:forbid:*/ECB/*/*

• 不應使用弱 hash 演算法和容易衝突的 hash 演算法。不安全的 hash 可能還會允許長度擴充套件攻擊,攻擊者可通過此類攻擊為使用原始訊息作為字首的訊息生成有效 hash。這相當於以下檢查器選項:forbid:SHA0|SHA1|MD2|MD4|MD5|RIPEMD/*/*/*

• 不應使用 RC4 演算法。該演算法的初始輸出包含可測量偏差,這可以讓具有足夠硬體的攻擊者破解此加密。

這相當於以下檢查器選項:forbid:RC4/*/*/*

• 不應使用少於 128 位的金鑰大小。針對對稱密碼演算法使用短金鑰可以讓具有足夠硬體的攻擊者破解此加密。

• 對於 C# 和 Java:

預覽 Web 應用程式安全檢查器啟用。要啟用 RISKY_CRYPTO 與其他預覽級 Web 應用程式檢查器,請使用 --webapp-security-preview 選項。

示例

本部分提供了一個或多個 RISKY_CRYPTO 示例。

C/C++

下面的示例呼叫了 Windows Crytography API 函式 CryptoDeriveKey 來生成使用資料加密標準 (DES)的金鑰,這是一種保護作用很有限的演算法,因為通過桌上型電腦可以很輕鬆地破解該演算法。

CryptDeriveKey(hCryptProv, CALG_DES, hHash, 0, &hKey));


C#

下面的示例使用了舊版 DES 演算法,這是一種保護作用很有限的演算法,因為通過桌上型電腦可以很輕鬆地破解該演算法。

DES des = DES.Create("DES");

下面的示例建立了用於強 AES 演算法的金鑰,但使用了 96 位的弱金鑰大小。該檢查器可針對弱金鑰大小報告缺陷。

Aes aes = Aes.Create("AES");

aes.KeySize = 96;


Java

下面的示例使用了舊版 DES 演算法,這是一種保護作用很有限的演算法,因為通過桌上型電腦可以很輕鬆地破解該演算法。

Cipher desCipher = Cipher.getInstance("DES");

下面的示例建立了用於強 AES 演算法的金鑰,但使用了 112 位的弱金鑰大小。該檢查器可針對弱金鑰大小報告缺陷。

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

keyGenerator.init(112);


選項

本部分描述了一個或多個 RISKY_CRYPTO 選項。

• RISKY_CRYPTO:allow:<transformation> - [已廢棄] 自版本 7.7.0 起此選項已廢棄,並將在未來版本中移除。

• RISKY_CRYPTO:assume_fips_mode:<boolean> - 被設定為 true 時,此選項會將加密提供程式視為 FIPS 140 相容。由於此模式禁止使用 SSL 版本 2.0 和 3.0(無論顯式還是預設),因此此選項將抑制相關缺陷。預設值為 RISKY_CRYPTO:assume_fips_mode:false

RISKY_CRYPTO:forbid:<transformation> - 此選項可將指定的轉換新增到被視為"有風險"的加密轉換集合中。該檢查器將在發現指定轉換時報告缺陷。預設值未設定。

您可以多次指定此選項,以便對每次轉換執行 OR 運算。

• RISKY_CRYPTO:require_asymmetric:<transformation> - 此選項要求所有不對稱演算法匹配指定的轉換。該選項會覆蓋用於不對稱演算法的所有其他選項。如果該檢查器發現與此選項不匹配的不對稱轉換,它會報告缺陷。預設值未設定。

您可以多次指定此選項,以便對每次轉換執行 OR 運算。

有關選項值的描述,請參閱轉換格式。

• RISKY_CRYPTO:require_hash:<transformation> - 此選項要求所有 hash 演算法匹配指定的轉換。該選項會覆蓋用於 hash 演算法的所有其他選項。如果該檢查器發現與此選項不匹配的 hash 轉換,它會報告缺陷。預設值未設定。您可以多次指定此選項,以便對每次轉換執行 OR 運算。有關選項值的描述,請參閱轉換格式。

• RISKY_CRYPTO:require_symmetric:<transformation> - 此選項要求所有對稱演算法匹配指定的轉換。該選項會覆蓋用於對稱演算法的所有其他選項。如果該檢查器發現與此選項的值不匹配的對稱轉換,它會報告缺陷。預設值未設定。您可以多次指定此選項,以便對每次轉換執行 OR 運算。

轉換格式

<transformation> 值是採用 <Algorithm>/<Block Mode>/<Padding>/<Minimum Key

Size> 格式編寫的元組。對於 <Algorithm>、<Block Mode> 和 <Padding> 中的每一個,指

定的值都是描述該演算法的字串。<Minimum Key Size> 獲取正值(以位為單位)。*(星號)表示轉換可以與該欄位的任意值匹配。轉換示例為 AES/CBC/*/128。此外,還可以使用符號 | 表示任意欄位的 OR 運算;例如:AES|Blowfish/CBC/*/128


事件

本部分描述了 RISKY_CRYPTO 檢查器生成的一個或多個事件。

• crypto_field - 檢測到特定型別的加密資料元素。此元素可能是演算法、塊密碼模式或與該檢查器相關的某些其他資訊。

• risky_crypto_use - 發現錯誤的加密配置。

同時發個檢測示例如下(現在已經全部中文化了,截圖的Linux系統沒裝中文字型庫):



如果您想要使用Coverity,請聯絡原廠負責人韓葆,15210834682,[email protected]

相關推薦

GoogleSHA1雜談-在開發規避強度加密演算法

Google的研究人員剛剛創造了計算機加密學在2017年的第一個里程碑:他們攻破了SHA-1安全加密演算法。 這確實是一個里程碑,其實很早之前Google就已經制定規則停止SHA1的使用了。 安全加密演算法其實是所有開發團隊都需要重視的問題之一,蓋因低強度的加密演算法太過於容易被攻破,而底層的密碼演算法被攻破

JavaKotlin混合開發的問題

** Kotlin成為了Android的官方語言 於是後知後覺的開始在專案中引入kotlin,但是隻知其優點,不知其詳細則不可,於是加班加點的系統地學習了一下Kotlin之後,開始了專案的kotlin開發。 在專案中進行開發的時候,因為之前是java開

專案開發遇到的--Bug知識整理

====第一個Bug====》》  目前測試出現在IE7,IE6中。     問題:<button></button>標籤,經測試,不相容IE7,IE6. (個人建議不要使用button標籤)     解決方案:改成<input type="button" value="提交"

一文讓你輕鬆瞭解JAVA開發的四種加密方法

文章目錄 一、工具類 md5加密工具類 base64加密工具類 Bcrypt工具類 二、加密測試 MD5加密測試 base6

Java4大基本加密演算法解析 Java4大基本加密演算法解析

Java中4大基本加密演算法解析   Base64是網路上最常見的用於傳輸8Bit位元組程式碼的編碼方式之一,大家可以檢視RFC2045~RFC2049,上面有MIME的詳細規範。 簡單的java加密演算法有: BASE64

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用, 各種加密演算法比較

加密演算法(DES,AES,RSA,MD5,SHA1,Base64)比較和專案應用 - sochishun - 部落格園 https://www.cnblogs.com/sochishun/p/7028056.html     加密演算法(DES,AES,RSA,MD

c# 實現MD5,SHA1,SHA256,SHA512等常用加密演算法

在很多電子商務和社群應用中,我們都要存放很多的客戶的資料,其中包括了很多的隱私資訊和客戶不願被別人看到的資訊,當然好有客戶執行各種操作的密碼,此時就需要對客戶的資訊進行加密再儲存,目前有兩種比較好的加密演算法:MD5和sha1。 這兩種加密演算法都屬於雜湊加密技術。所謂

Java4大基本加密演算法解析

簡單的java加密演算法有: BASE64 嚴格地說,屬於編碼格式,而非加密演算法 MD5(Message Digest algorithm 5,資訊摘要演算法) SHA(Secure Hash Algorithm,安全雜湊演算法) HMAC(Hash Messa

java常用的對稱加密演算法

一 常用的對稱加密演算法 對稱加密演算法簡單來講就是加密和解密使用同一個金鑰,並且加密解密互為逆運算,如加法和減法,先加密再解密 與先解密後加密都能得到原結果,常用的加密演算法有DES;3DES(二倍長,三倍長);AES; 3DES是DES擴充套件,3D

commons-codec[md5,sha,base64加密演算法]的實現demo

專案用到給使用者密碼加密,下載了apache的commons-codec jar包,貼出對幾種加密演算法實現的demo。記之。 commons-codec-1.10下載連結: http://commons.apache.org/proper/commons-codec/do

iOS開發地圖定位

視圖 編寫 aps 簡單 -a 第三方 span spa margin   不管是QQ還是微信的移動client都少不了定位功能,之前在微信demo中沒有加入定位功能,今天就寫個定位的小demo來了解一下定位和地圖的東西。地圖和定位看上去是挺高大上一東西。其有使用方法比

IOS開發之——objectForKeyvalueForKey在NSDictionary的差異

什麽 iat app 報錯信息 lease 方法 去掉 defined atom 從 NSDictionary 取值的時候有兩個方法,objectForKey: 和 valueForKey:,這兩個方法具體有什麽不同呢? 先從 NSDictionary 文檔中來看這兩個方法

對於軟件開發開發人員測試人員關系的理解

我不知道 統一 選擇 好聽 dash 過去 思路 排查 定位   在軟件開發中都會有開發人員(以下簡稱開發)和測試人員(以下簡稱測試),在一些小型公司可能並沒有測試,僅僅是開發兼任測試。在這裏我僅針對於有專業的測試和專業的開發的項目。   每個公司應該都有考核機制,對於開

iOS開發的position+anchorPointframe應用解釋

移動 pos 限制 一起 frame -1 必須 posit 解釋 我剛開始時非常困惑這兩個地方, 所以現在好好解釋一下他們的聯系. 1/ position與anchorPoint是一對屬性, 經常一起設置來確定控件的位置 frame單獨設置 2/ position

談談Google微信H5牛牛的Java開發規範

基本類 cli 多好 而且 spring final關鍵字 永久 zab rop 多年前,Google發布微信H5牛牛搭建平臺(h5.fanshubbs.com)來定義Java編碼時應遵循的微信牛牛Q_1687054422規範;今年年初阿裏則發布阿裏巴巴Java 開發手冊,

微信開發網頁授權access_token基礎支持的access_token異同

amp api ken 獲取 use 有效期 公眾號 分享 什麽 問題1:網頁授權access_token與分享的jssdk中的access_token一樣嗎?答:不一樣。網頁授權access_token 是一次性的,而基礎支持的access_token的是有時間限制的:7

接口開發 遇到的坑——Java byteC# byte 數據轉換問題

pan 數據 byte[] 文件 成就 開發 bytes 合同 () 前提: 公司與其他公司進行接口對接 需要使用Byte[]數據流傳輸數據 原本想法如下:直接IO生成就ok了 using System; using System.IO; using Syst

在python web開發的文件上傳下載

iterator makedirs pat type med code 獲取 保存 media django 框架下 實現服務端的文件上傳與下載: import jsonimport osimport uuiddef attachment_upload(request

在Opengl開發,運用Eigenglm數學庫時的心得體會

1, 資料矩陣的儲存區別:     Eigen是按列儲存的, glm是按行儲存的;     glm::mat4 m1(1);     glm::mat4 m0(0);    

微信小程式開發textarea文字域監聽字數限制動態計算

微信小程式開發時常會有評論或者備註功能,都會用到文字域字元長度計算以及字元限制的功能,筆者把最簡潔易用的案例分享出來。學習之前先看微信官方API文件 https://mp.weixin.qq.com/debug/wxadoc/dev/component/textarea.html