不積跬步,無以至千里;不積小流,何以成江海.
每天學習一個Python模組,一個月可以瞭解30個模組,一年可以… …
今天看了一個Python中的hashlib及hmac模組,這兩個模組用來hash加密。說到加密,首先要了解加密的基本知識:hash加密,對稱加密,不對稱加密,數字簽名等等。相關的知識可以在msdn上查閱:http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx
使用Python中的hashlib來進行hash加密是非學簡單的,下面是一段簡單程式碼:
1 2 3 4 5 6 7 |
import hashlib md5 = hashlib.md5() #建立一個MD5加密物件 md5.update("JGood is a handsome boy") #更新要加密的資料 print md5.digest() #加密後的結果(二進位制) print md5.hexdigest() #加密後的結果,用十六進位制字串表示。 print 'block_size:', md5.block_size print 'digest_size:', md5.digest_size |
非常的簡單,其實如果說加密一個字串,根本不用寫上面這麼多程式碼,一條語句就可以了:
1 2 |
print '-' * 25, '更簡潔的語法', '-' * 25 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加密演算法,其實也不是很難:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/// <summary> /// 按指定加密演算法,對字串進行加密 /// </summary> /// <param name="hashName">加密演算法名稱</param> /// <param name="data">要加密資料</param> /// <returns>加密後的資料</returns> private static string Encrypt(string hashName, string data) { byte[] btData = System.Text.Encoding.ASCII.GetBytes(data); //建立一個 HashAlgorithm派生類的例項 HashAlgorithm hasher = HashAlgorithm.Create(hashName); //使用hash加密 byte[] hashedData = hasher.ComputeHash(btData); StringBuilder result = new StringBuilder(); foreach (byte b in hashedData) { result.Append(b.ToString("x2")); //轉換成16進位制字串儲存 } return result.ToString(); } |
附上用.NET編寫的常用hash加密演算法程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/// <summary> /// HashEncryptor類:提供各種hash加密演算法的實現 /// </summary> /// <example> /// //使用MD5加密 /// string data = "JGood"; /// string encryptedData = HashEncryptor.MD5(data); /// </example> /// <remarks> /// HashEncryptor提供的加密演算法都是不可逆的。 /// </remarks> public sealed class HashEncryptor { /// <summary> /// 私有建構函式,該類不能被例項化 /// </summary> private HashEncryptor() { } /// <summary> /// 使用MD5加密演算法加密字串 /// </summary> /// <param name="data">要加密的字串</param> /// <returns>加密後的字串</returns> public static string MD5(string data) { return Encrypt("MD5", data); } /// <summary> /// 使用SHA1加密演算法加密字串 /// </summary> /// <param name="data">要加密的字串</param> /// <returns>加密後的字串</returns> public static string SHA1(string data) { return Encrypt("SHA1", data); } /// <summary> /// 使用SHA 256位加密演算法加密字串 /// </summary> /// <param name="data">要加密的字串</param> /// <returns>加密後的字串</returns> public static string SHA256(string data) { return Encrypt("SHA256", data); } /// <summary> /// 使用SHA 384位加密演算法加密字串 /// </summary> /// <param name="data">要加密的字串</param> /// <returns>加密後的字串</returns> public static string SHA384(string data) { return Encrypt("SHA384", data); } /// <summary> /// 使用SHA 512位加密演算法加密字串 /// </summary> /// <param name="data">要加密的字串</param> /// <returns>加密後的字串</returns> public static string SHA512(string data) { return Encrypt("SHA512", data); } /// <summary> /// 按指定加密演算法,對字串進行加密 /// </summary> /// <param name="hashName">加密演算法名稱</param> /// <param name="data">要加密資料</param> /// <returns>加密後的資料</returns> private static string Encrypt(string hashName, string data) { byte[] btData = System.Text.Encoding.ASCII.GetBytes(data); //建立一個 HashAlgorithm派生類的例項 HashAlgorithm hasher = HashAlgorithm.Create(hashName); //使用hash加密 byte[] hashedData = hasher.ComputeHash(btData); StringBuilder result = new StringBuilder(); foreach (byte b in hashedData) { result.Append(b.ToString("x2")); //轉換成16進位制儲存 } return result.ToString(); } } |