Python模块学习之hashlib hash加密

发布时间:2019-10-07编辑:脚本学堂
本文介绍下python模块hashlib的用法,学习使用python中的hashlib模块进行hash加密的方法,有需要的朋友参考下。

今天看了一个python中的hashlib及hmac模块,这两个模块用来hash加密。
说到加密,首先要了解加密的基本知识:hash加密,对称加密,不对称加密,数字签名等等。

相关的知识可以在msdn上查阅:http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx

使用Python中的hashlib来进行hash加密是非学简单的。

来看一段简单的代码:
 

复制代码 代码示例:
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 

其实如果说加密一个字符串,根本不用写上面这么多代码,一条语句即可:
 

复制代码 代码示例:
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加密算法,其实也不是很难:
 

复制代码 代码示例:
/// <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加密算法代码:
 

复制代码 代码示例:
/// <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(); 
    }