本文示例代碼詳見:https://github.com/52fhy/crypt-demophp
摘要算法又稱哈希/散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。算法不可逆。python
散列/哈希算法有:git
SHA1 SHA224 SHA256 SHA384 SHA512 MD5 HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 HmacMD5 PBKDF2
MD5(Message-Digest Algorithm 5,消息摘要算法版本5)是最多見的摘要算法,它由MD二、MD三、MD4發展而來,速度很快。github
MD二、MD四、MD5 都產生16字節(128位)的校驗值,通常用32位十六進制數表示。MD2的算法較慢但相對安全,MD4速度很快,但安全性降低,MD5比MD4更安全、速度更快。算法
示例:安全
<?php echo md5('123456'); //e10adc3949ba59abbe56e057f20f883e
CryptoJS.MD5('123456').toString(); //"e10adc3949ba59abbe56e057f20f883e"
import hashlib md5 = hashlib.md5() md5.update('123456'.encode('utf-8')) print(md5.hexdigest()) # e10adc3949ba59abbe56e057f20f883e
一般,在使用md5保存用戶口令時,須要通過Salt處理,這樣只要Salt不被黑客知道,即便用戶輸入簡單口令,也很難經過MD5反推明文口令:函數
<?php echo md5('123456' . 'Salt'); //7c7dd7e00f2bd6ba637009f35e05b3e8
SHA(Secure Hash Algorithm)是由美國專門制定密碼算法的標準機構—— 美國國家標準技術研究院(NIST)制定的。工具
SHA系列算法的摘要長度分別爲:SHA爲20字節(160位,一般用一個40位的16進制字符串表示)、SHA256爲32字節(256位)、 SHA384爲48字節(384位)、SHA512爲64字節(512位),因爲它產生的數據摘要的長度更長,所以更難以發生碰撞,所以也更爲安全,它是將來數據摘要算法的發展方向。因爲SHA系列算法的數據摘要長度較長,所以其運算速度與MD5相比,也相對較慢。加密
SHA1的應用較爲普遍,主要應用於CA和數字證書中,另外在互聯網中流行的BT軟件中,也是使用SHA1來進行文件校驗的。.net
示例:
<?php echo sha1('123456'); //7c4a8d09ca3762af61e59520943dc26494f8941b
CryptoJS.SHA1('123456').toString(); //"7c4a8d09ca3762af61e59520943dc26494f8941b" CryptoJS.SHA256('123456').toString(); //"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"
import hashlib # sha224, sha256, sha384, sha512同理 sha1 = hashlib.sha1() sha1.update('123456'.encode('utf-8')) print(sha1.hexdigest()) # 7c4a8d09ca3762af61e59520943dc26494f8941b
HMAC算法的實現過程須要一個加密用的散列函數(表示爲H)和一個密鑰。
通常咱們採用的散列函數爲Md5或者SHA1,這兩個散列函數的分割數據塊長度都是64字節,即512位。
HmacMD5算法就是採用密鑰加密 + Md5信息摘要
的方式造成新的密文。使用該方法,須要提供一個加密密鑰。加密的結果是160 bit字節(40位的16進制字符串)。
示例:
CryptoJS.HmacMD5('123456','pwd').toString(); //"a3aa6035b15bb6ea4041a939c315914a" CryptoJS.HmacSHA1('123456','pwd').toString(); //"20a4e59d574dfde8c83d5185b35c92e2eda206f0"
https://github.com/brix/crypto-js
CryptoJS (crypto.js) 爲 JavaScript 提供了各類各樣的加密算法。目前已支持的算法包括:
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。