Python 对字符串数据和文件数据进行MD5、SHA1、Base64哈希散列运算

 

Python 实现MD5加密

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import hashlib  

m = hashlib.md5()            # 创建md5对象  
m.update('mimvp.com')    # 生成加密串,其中password是要加密的字符串  
print m.hexdigest()           # 打印经过md5加密的字符串  
  
输出结果:93161a376715ed7618796ecbd88d6fd1  

 

 

示例代码:

文件名:hash.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# copyright of mimvp.com

import hashlib
import base64


class YHash(object):

    @classmethod
    def get_md5(cls, data):
        md5 = hashlib.md5(data)
        return md5.hexdigest()
    
    @classmethod
    def get_sha1(cls, data):
        sha1 = hashlib.sha1(data)
        return sha1.hexdigest()
    
    @classmethod
    def get_base64(cls, data):
        b64 = base64.b64encode(data)
        return b64
    
    @classmethod
    def get_file_hash(cls, filePath, hash_type='md5'):
        data_hash = ''
        
        data = ''
        with open(filePath, 'r') as f:
            data = f.read()
            
        if 'md5' == hash_type:
            md5 = hashlib.md5()
            md5.update(data)
            data_hash = md5.hexdigest()
        elif 'sha1' == hash_type:
            sha1 = hashlib.sha1()
            sha1.update(data)
            data_hash = sha1.hexdigest()
        elif 'base64' == hash_type:
            b64 = base64.b64encode(data)
            data_hash = b64
        
        return data_hash
    
    
if __name__ == '__main__':
    data = 'www.mimvp.com'
    
    print("str md5: %s, len: %d" % (YHash.get_md5(data), len(YHash.get_md5(data))))
    print("str sha1: %s, len: %d" % (YHash.get_sha1(data), len(YHash.get_sha1(data))))
    print("str base64: %s, len: %d" % (YHash.get_base64(data), len(YHash.get_base64(data))))
    
    print("file md5: %s, len: %d" % (YHash.get_file_hash('hash_test.txt', hash_type='md5'), len(YHash.get_file_hash('hash_test.txt', hash_type='md5'))))
    print("file sha1: %s, len: %d" % (YHash.get_file_hash('hash_test.txt', hash_type='sha1'), len(YHash.get_file_hash('hash_test.txt', hash_type='sha1'))))
    print("file base64: %s, len: %d" % (YHash.get_file_hash('hash_test.txt', hash_type='base64'), len(YHash.get_file_hash('hash_test.txt', hash_type='base64'))))

 

运行结果:

str md5: 52c06085c45297325433e0c75b140565, len: 32
str sha1: 2f465e03a1f69f5cfe1a92b3a946e689866b1486, len: 40
str base64: d3d3Lm1pbXZwLmNvbQ==, len: 20
file md5: 2587912c3063fbe9232d9753a4405349, len: 32
file sha1: 48181e759a2a4d8a1e0ffea636d15c007b0cc1e6, len: 40
file base64: IyEvdXNyL2Jpbi9l................KSk=, len: 2512

 

使用Python进行文件Hash计算有两点必须要注意:

1、文件打开方式,一定要是二进制方式,即打开文件时使用b模式,否则Hash计算是基于文本的那将得到错误的文件Hash,网上看到有人说遇到Python的Hash计算错误在大多是由于这个原因造成的。实际经测试,发现文件打开方式"r"和"rb"的Hash值都是一样的(Ubuntu平台),为了确保万无一失,建议还是使用”rb“方式打开文件。

2、对于MD5如果需要16位(bytes)的值,那么调用对象的digest(),而hexdigest()默认是32位(bytes);同理Sha1的digest()和hexdigest()分别产生20位(bytes)和40位(bytes)的hash值

 

 

参考推荐

Python中Base64编码和解码

php 加密算法md5, sha1

PHP 对称加密AES算法

PHP 更安全的加密机制 Bcrypt

AES、DES、RSA三种典型加密算法

AES 加密算法的详细介绍与实现

PHP 使用cookie实现记住登录状态

PHP Session与Cookie详解

公钥,私钥,数字签名的通俗理解