密碼學之摘要算法


本文示例代碼詳見:https://github.com/52fhy/crypt-demo

摘要算法

摘要算法又稱哈希/散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。算法不可逆。

散列/哈希算法有:

SHA1  SHA224  SHA256  SHA384  SHA512  MD5
HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 HmacMD5 PBKDF2

MD5

MD5(Message-Digest Algorithm 5,消息摘要算法版本5)是最常見的摘要算法,它由MD2、MD3、MD4發展而來,速度很快。

MD2、MD4、MD5 都產生16字節(128位)的校驗值,一般用32位十六進制數表示。MD2的算法較慢但相對安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。

示例:

  • PHP
<?php
echo md5('123456'); //e10adc3949ba59abbe56e057f20f883e
  • CryptoJS
CryptoJS.MD5('123456').toString();
//"e10adc3949ba59abbe56e057f20f883e"
  • Python
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

SHA1

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來進行文件校驗的。

示例:

  • PHP
<?php
echo sha1('123456'); //7c4a8d09ca3762af61e59520943dc26494f8941b
  • CryptoJS
CryptoJS.SHA1('123456').toString();
//"7c4a8d09ca3762af61e59520943dc26494f8941b"

CryptoJS.SHA256('123456').toString();
//"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"
  • Python
import hashlib

# sha224, sha256, sha384, sha512同理
sha1 = hashlib.sha1()
sha1.update('123456'.encode('utf-8'))
print(sha1.hexdigest())

# 7c4a8d09ca3762af61e59520943dc26494f8941b

HmacMD5

HMAC算法的實現過程需要一個加密用的散列函數(表示為H)和一個密鑰。

一般我們采用的散列函數為Md5或者SHA1,這兩個散列函數的分割數據塊長度都是64字節,即512位。

HmacMD5算法就是采用密鑰加密 + Md5信息摘要的方式形成新的密文。使用該方法,需要提供一個加密密鑰。加密的結果是160 bit字節(40位的16進制字符串)。

示例:

  • CryptoJS
CryptoJS.HmacMD5('123456','pwd').toString();
//"a3aa6035b15bb6ea4041a939c315914a"

CryptoJS.HmacSHA1('123456','pwd').toString();
//"20a4e59d574dfde8c83d5185b35c92e2eda206f0"

常用庫介紹

Crypto-JS

https://github.com/brix/crypto-js

CryptoJS (crypto.js) 為 JavaScript 提供了各種各樣的加密算法。目前已支持的算法包括:

  • MD5
  • SHA-1
  • SHA-256
  • AES
  • Rabbit
  • MARC4
  • HMAC
    • HMAC-MD5
    • HMAC-SHA1
    • HMAC-SHA256
  • PBKDF2

hashlib

Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。

在線工具

1、在線加密解密
http://tool.oschina.net/encrypt?type=2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM