不積跬步,無以至千裡;不積小流,何以成江海.
每天學習一個Python模組,一個月可以瞭解30個模組,一年可以... ...
今天看了一個Python中的hashlib及hmac模組,這兩個模組用來hash加密。說到加密,首先要瞭解加密的基本知識:hash加密,對稱式加密,不對稱式加密,數位簽章等等。相關的知識可以在msdn上查閱:http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx
使用Python中的hashlib來進行hash加密是非學簡單的,下面是一段簡單代碼:
import hashlib<br />md5 = hashlib.md5() #建立一個MD5加密對象<br />md5.update("JGood is a handsome boy") #更新要加密的資料<br />print md5.digest() #加密後的結果(二進位)<br />print md5.hexdigest() #加密後的結果,用十六進位字串表示。<br />print 'block_size:', md5.block_size<br />print 'digest_size:', md5.digest_size
非常的簡單,其實如果說加密一個字串,根本不用寫上面這麼多代碼,一條語句就可以了:
print '-' * 25, '更簡潔的文法', '-' * 25<br />print hashlib.new("md5", "JGood is a handsome boy").hexdigest()
hashlib模組還支援其他的hash密碼編譯演算法,如:sha1, SHA224等等,要瞭解更多的知識,查一下Python手冊。
Python hash VS .NEt hash
我出身是一個.NET程式員,以前也寫過一些.NET下的hash加密類,在.NET中可以使用以下代碼來實現MD5密碼編譯演算法,其實也不是很難:
/// <summary><br />/// 按指定密碼編譯演算法,對字串進行加密<br />/// </summary><br />/// <param name="hashName">密碼編譯演算法名稱</param><br />/// <param name="data">要加密資料</param><br />/// <returns>加密後的資料</returns><br />private static string Encrypt(string hashName, string data)<br />{<br /> byte[] btData = System.Text.Encoding.ASCII.GetBytes(data);<br /> //建立一個 HashAlgorithm衍生類別的執行個體<br /> HashAlgorithm hasher = HashAlgorithm.Create(hashName);<br /> //使用hash加密<br /> byte[] hashedData = hasher.ComputeHash(btData);<br /> StringBuilder result = new StringBuilder();<br /> foreach (byte b in hashedData)<br /> {<br /> result.Append(b.ToString("x2")); //轉換成16進位字串儲存<br /> }<br /> return result.ToString();<br />}
附上用.NET編寫的常用hash密碼編譯演算法代碼:
/// <summary><br />/// HashEncryptor類:提供各種hash密碼編譯演算法的實現<br />/// </summary><br />/// <example><br />/// //使用MD5加密<br />/// string data = "JGood";<br />/// string encryptedData = HashEncryptor.MD5(data);<br />/// </example><br />/// <remarks><br />/// HashEncryptor提供的密碼編譯演算法都是無法復原的。<br />/// </remarks><br />public sealed class HashEncryptor<br />{<br /> /// <summary><br /> /// 私人建構函式,該類不能被執行個體化<br /> /// </summary><br /> private HashEncryptor()<br /> {<br /> }<br /> /// <summary><br /> /// 使用MD5密碼編譯演算法加密字串<br /> /// </summary><br /> /// <param name="data">要加密的字串</param><br /> /// <returns>加密後的字串</returns><br /> public static string MD5(string data)<br /> {<br /> return Encrypt("MD5", data);<br /> }<br /> /// <summary><br /> /// 使用SHA1密碼編譯演算法加密字串<br /> /// </summary><br /> /// <param name="data">要加密的字串</param><br /> /// <returns>加密後的字串</returns><br /> public static string SHA1(string data)<br /> {<br /> return Encrypt("SHA1", data);<br /> }<br /> /// <summary><br /> /// 使用SHA 256位密碼編譯演算法加密字串<br /> /// </summary><br /> /// <param name="data">要加密的字串</param><br /> /// <returns>加密後的字串</returns><br /> public static string SHA256(string data)<br /> {<br /> return Encrypt("SHA256", data);<br /> }<br /> /// <summary><br /> /// 使用SHA 384位密碼編譯演算法加密字串<br /> /// </summary><br /> /// <param name="data">要加密的字串</param><br /> /// <returns>加密後的字串</returns><br /> public static string SHA384(string data)<br /> {<br /> return Encrypt("SHA384", data);<br /> }<br /> /// <summary><br /> /// 使用SHA 512位密碼編譯演算法加密字串<br /> /// </summary><br /> /// <param name="data">要加密的字串</param><br /> /// <returns>加密後的字串</returns><br /> public static string SHA512(string data)<br /> {<br /> return Encrypt("SHA512", data);<br /> }<br /> /// <summary><br /> /// 按指定密碼編譯演算法,對字串進行加密<br /> /// </summary><br /> /// <param name="hashName">密碼編譯演算法名稱</param><br /> /// <param name="data">要加密資料</param><br /> /// <returns>加密後的資料</returns><br /> private static string Encrypt(string hashName, string data)<br /> {<br /> byte[] btData = System.Text.Encoding.ASCII.GetBytes(data);<br /> //建立一個 HashAlgorithm衍生類別的執行個體<br /> HashAlgorithm hasher = HashAlgorithm.Create(hashName);<br /> //使用hash加密<br /> byte[] hashedData = hasher.ComputeHash(btData);<br /> StringBuilder result = new StringBuilder();<br /> foreach (byte b in hashedData)<br /> {<br /> result.Append(b.ToString("x2")); //轉換成16進位儲存<br /> }<br /> return result.ToString();<br /> }<br />}