常用的簽名算法

寫在前面:加密和簽名是兩回事,加密的目的是防止信息泄露,簽名的目的是防止篡改和偽造

MD5、SHA-1、SHA-256、HMAC-SHA256等屬于哈希算法,計算數字摘要,不可逆,有碰撞

DES、AES、RSA等屬于加密算法,對數據進行加解密,可逆

MD5簽名

MD5簽名通常先按照一定規則排列待簽名數據,進行加鹽(拼key),然后使用MD5摘要算法計算摘要,得到的散列值即為sign

MD5驗簽即按照相同的規則排列待簽名數據,使用相同的key,然后使用MD5摘要算法計算摘要,對比自己得到的sign值和對方傳過來的sign值是否相等

參考資料:MD5算法原理

MD5簽名的優點

  • 運行速度快
  • 任意長度的數據,算出的MD5值長度都是固定的(128bit,即32位16進制數)

MD5簽名的缺點

MD5作為一種散列算法,雖然很難發生散列碰撞,但是仍然存在兩種不同數據會發生碰撞

MD5碰撞

已知明文A,可以計算得到另一個明文B和A的MD5值相同,但是并不能保證B是一段有意義的文字

未知明文A,已知MD5值X,無法計算得到明文A

MD5破解方法(MD5值反推明文)

暴力枚舉、字典法、彩虹表法(對字典表的優化)

參考資料:MD5破解方法

MD5算法已不那么不安全

  • MD5不應該被用于軟件/文件完整性的校驗
  • MD5不應該被用于數字證書
  • 禁止將密碼等敏感信息直接MD5后存儲,必須加鹽
  • MD5作為接口參數的簽名算法,拼的key必須嚴格保密,所以不適合做提供給外公司調用的接口的簽名算法
  • MD5作為接口參數的簽名算法,key一般拼接在待簽名數據的后面,可能會被暴力枚舉法攻擊得到key,所以key不能太簡單

什么情況下適合用MD5作為簽名算法?

  • 提供給公司內部調用,但是又有一定安全性要求的接口。比如閱餅贈送接口、支付寶單筆轉賬接口等,有wiki查詢權限的人就可以手工調用
  • 對性能要求比較高,又有一定安全性要求的接口

SHA-1算法

網上的這篇文章說的比較清楚:SHA1算法原理

SHA-1算法已不那么不安全

SHA-1一般被應用于數字證書的簽名哈希算法,或者RSA簽名中的哈希算法
經過權威機構證實,sha1算法的不安全性越來越高,sha指紋造假成本越來越低,隨即微軟、谷歌等IT巨頭相繼發布棄用sha1哈希算法聲明,第三方認證機構自2016年1月1日起,將全面停止簽發SHA1算法的數字證書。

SHA-256算法

網上的這篇文章說的比較清楚:SHA256算法原理

小tips

SHA-1算法和SHA-256算法并不是近親,SHA-256算法屬于SHA-2算法。SHA-1是160位的哈希值,而SHA-2是組合值,有不同的位數,SHA-256就是256位的SHA-2。SHA-1算法和MD5算法都是由MD4算法導出,所以這倆是近親。

SHA-256算法的應用

  • 數字證書的簽名算法,替代SHA-1
  • 比特幣,區塊鏈
  • RSA簽名中使用的哈希算法

MD5、SHA-1、SHA-256比較

  • 速度:MD5>SHA-1>SHA-256
  • 安全性:MD5<SHA-1<<SHA-256
  • 哈希值長度:MD5(128bit)<SHA-1(160bit)<SHA-256(256bit)

什么情況下適合用SHA-256作為簽名算法?

  • SHA-256做簽名仍然需要加鹽(拼key),所以適合內部使用
  • 時間消耗大約是MD5的1.5倍到2倍,CPU負載也更高,在性能要求不高的情況下代替MD5

慢哈希bcrypt

顧名思義,慢哈希就是很慢,主要為了防止暴力破解。由于慢,通常都用在客戶端或者對性能沒什么要求的場景

加鹽

隨機鹽還是固定鹽?

  • 固定鹽就是所有的密碼使用統一的salt,放在代碼里,salt需要有一定復雜度
  • 隨機鹽可以使用用戶的一個唯一的、必有的、不可更改的屬性來生成鹽,需要同樣存到庫里,但是可以分開存儲
固定鹽的缺點
  • 會被黑客找到弱密碼:統計哪些哈希值出現的頻率較高,哪些就是弱密碼
  • 有可能被彩虹表破解
加鹽的方式

業內通用的一般是MD5(MD5(password)+salt)或SHA256(SHA256(password)+salt)

服務端加鹽

客戶端進行SHA256(password),并傳輸給服務端,服務端進行SHA256(SHA256(password)+salt)

  • 更安全的方式是同時使用https
  • 更更安全的方式可以參考擴展閱讀中的“即使被拖庫,也可以保證密碼不泄露”

“弱密碼”究竟安不安全?為什么現在的支付密碼普遍是六位數字?

  • 復雜的密碼用戶容易忘記
  • 首先要登錄才允許支付
  • 其他安全手段,比如:綁定手機號,綁定設備,在設備更換時發送驗證碼
  • 有限的允許錯誤次數

擴展閱讀

RSA簽名

RSA簽名過程

  1. 按照一定規則排列待簽名數據得到待簽名字符串
  2. 使用MD5、SHA-1、SHA-256(推薦)等哈希算法計算出待簽名字符串的摘要
  3. 對摘要使用私鑰加密

RSA驗簽過程

  1. 對簽名進行公鑰解密,得到摘要
  2. 按照一定規則排列待簽名數據得到待簽名字符串
  3. 使用約定的哈希算法計算出待簽名字符串的摘要
  4. 比較兩個摘要是否相同

RSA簽名的優點

  • 安全性高
  • 使用非對稱加密,有助于對密鑰的保護

RSA簽名的缺點

什么情況下適合用RSA簽名算法?

  • 性能要求不高但安全性要求高
  • 給其他公司的接口
  • 服務端和客戶端之間的接口

ps:小數據如果既要加密又要簽名,可以直接使用RSA私鑰加密整個數據,接收方公鑰解密,不做簽名

拼接待簽名字符串的一些問題

  1. 當url中和body中有一個相同的參數但是其值不同,驗簽和實際使用的參數可能不一致,產生漏洞
    • 約定只使用get或post的參數
    • 驗簽放在取值之后,用實際取到的參數拼接待簽名字符串
    • k,v不放到字典中,而是先拼接成k=v,然后放到set中
  2. 若存在兩個接口,參數相同,簽名key也相同,可以直接拿A接口的參數去請求B接口,產生漏洞
    • 定一個比如叫service_name的參數,來約定接口名稱,參與簽名
    • 將接口url以一定的規則參與到簽名中
  3. 指定哪些參數需要參與簽名
    • 不靈活,比如接口請求增加需要參與簽名的參數要改動簽名的邏輯,返回增加需要參與簽名的參數需要通知所有調用方
  4. 指定哪些參數不需要參與簽名
    • 通常不需要參與簽名的參數比較固定,例如sign_type
    • 使用MD5作為簽名算法時,可能會被雜湊攻擊

簽名無法防止重放攻擊

比如贈送代金券的接口,拿到一個真實請求以后重復調用。
解決方案:

  1. 增加時間戳字段(需參與簽名),保存X時間的請求驗證是否重復,時間戳超過X時間則認為請求無效
  2. 由業務來保證,增加一個唯一的流水號,不重復贈送

算法速度比較

  • 環境:本地 window10 i5-6300U

  • 語言:java

  • 文本:漢字,length770

  • 字符集:utf-8

  • 循環計算10000次,一共執行10次,取平均毫秒數

    1. md5:128
    2. sha1:158
    3. sha256:218
  • 循環計算1000次,一共執行10次,取平均毫秒數

    1. rsa-1024-sha1:879
    2. rsa-1024-sha256:987
    3. rsa-2048-sha256:4309
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這篇文章主要講述在Mobile BI(移動商務智能)開發過程中,在網絡通信、數據存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,641評論 0 6
  • 前言 本文梳理主要基于書籍《Java加密與解密的藝術》、維基百科、百度百科以及網絡上眾多資料,如有涉及版權問題,請...
    hello_cyz閱讀 2,157評論 1 7
  • 這里先簡單介紹單向散列函數、消息摘要和哈希碰撞的的概念 單向散列函數: 將任意長度的信息轉換為較短的固定長度的值,...
    坤_7a1e閱讀 3,535評論 0 0
  • 區塊鏈系統的核心之二-加密技術 加密技術主要是用來解決區塊鏈系統記錄的數據的所有權問題。 1哈希算法 1)...
    yrm23閱讀 1,656評論 0 4
  • 密碼學基本概念 密碼學是研究如何隱密地傳遞信息的學科。在現代特別指對信息以及其傳輸的數學性研究,常被認為是數學和計...
    千尋與小米閱讀 558評論 0 1