Python常用模块之hashlib

一、md5算法加密数据

Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据

import hashlib
 
 
hash = hashlib.md5()#md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hash.update(bytes('admin',encoding='utf-8'))#要对哪个字符串进行加密,就放这里
print(hash.hexdigest())#拿到加密字符串
# hash2=hashlib.sha384()#不同算法,hashlib很多加密算法
# hash2.update(bytes('admin',encoding='utf-8'))
# print(hash.hexdigest())
 
 
hash3 = hashlib.md5(bytes('abd',encoding='utf-8'))
''' 如果没有参数,所以md5遵守一个规则,生成同一个对应关系,如果加了参数,
就是在原先加密的基础上再加密一层,这样的话参数只有自己知道,防止被撞库,
因为别人永远拿不到这个参数
'''
hash3.update(bytes('admin',encoding='utf-8'))
print(hash3.hexdigest())

这里写一个利用md5进行用户登陆网站进行注册之后密码加密的基本事例,加深理解。这里只简单写了一个用户的注册以及登陆

#hashlib简单使用
def md5(arg):#这是加密函数,将传进来的函数加密
    md5_pwd = hashlib.md5(bytes('abd',encoding='utf-8'))
    md5_pwd.update(bytes(arg,encoding='utf-8'))
    return md5_pwd.hexdigest()#返回加密的数据
def log(user,pwd):#登陆时候时候的函数,由于md5不能反解,因此登陆的时候用正解
    with open('db','r',encoding='utf-8') as f:
        for line in f:
            u,p=line.strip().split('|')
            if u ==user and p == md5(pwd):#登陆的时候验证用户名以及加密的密码跟之前保存的是否一样
                return True
def register(user,pwd):#注册的时候把用户名和加密的密码写进文件,保存起来
    with open('db','a',encoding='utf-8') as f:
        temp = user+'|'+md5(pwd)
        f.write(temp)
 
i=input('1表示登陆,2表示注册:')
if i=='2':
    user = input('用户名:')
    pwd =input('密码:')
    register(user,pwd)
elif i=='1':
    user = user = input('用户名:')
    pwd =input('密码:')
    r=log(user,pwd)#验证用户名和密码
    if r ==True:
        print('登陆成功')
    else:
        print('登陆失败')
else:
    print('账号不存在')

二、md5校验文件完整性

Linux下校验文件MD5值,最简单的方法就是执行md5sum命令
md5sum filename
原本打算用subprocess调用系统命令来获取md5值,

import subprocess,shlex
cmd = "md5sum filename"
p = subprocess(shlex.split(cmd), stdout=subprocess.PIPE)
print p.stdout.read()


不过python有自带的MD5模块hashlib,用起来简单很多,
Python Hashlib模块的使用说明 http://docs.python.org/2/library/hashlib.html
fd = hashlib.md5() #获取一个MD5加密算法对象
fd.update("string") #指定需要加密的字符串
fd.hexdigest() #获取加密后的16进制字符串

实例

#!/usr/bin/env python           
 #coding : utf-8 3  4 import sys 
 import hashlib                  
                                 
 def md5sum(filename):           
     fd = open(filename,"r")
     fcont = fd.r
     fd.close()         
     fmd5 = hashlib.md5(fcont)
     return fmd5             
                                 
 if __name__ == "__main__":      
     fmd5 = md5sum(sys.argv[1])
     print fmd5.hexdigest()


其中fmd5 = hashlib.md5(fcont)等同于
fmd5 = hashlib.md5(fcont)
fmd5.update(fcont)

需要注意的是,传入 hashlib.md5() 的应该是 文件内容而不是文件名 ,这样才是对文件内容产生md5校验码;
另外,调用了 hashlib.md5() 后返回的是一个对象,想要获得linux下 md5sum 同样的效果,还要调用一下 hexdigest() 方法。

但是,这个方法有点过于粗暴,当检验大文件时,一次将所有文件内容读入内存,实在耗费较大,
网上给出实例http://blog.csdn.net/shanliangliuxing/article/details/10115397,
根据文件块长度,依次获取文件内容读入内存,通过update()逐次更新校验值,

#!/usr/bin/env python 2
 
 #coding : utf-8  
  import hashlib
  
  def md5hex(word):
     """ MD5加密算法,返回32位小写16进制符号
     """ 
     if isinstance(word, unicode):
         word = word.encode("utf-8")
     elif not isinstance(word, str):
         word = str(word)
     m = hashlib.md5()
     m.update(word)
     return m.hexdigest()
 
  def md5sum(fname):
     """ 计算文件的MD5值
     """
     def read_chunks(fh):
         fh.seek(0)
         chunk = fh.read(8096)
         while chunk:
             yield chunk
             chunk = fh.read(8096)
         else: #最后要将游标放回文件开头
             fh.seek(0)
     m = hashlib.md5()
     if isinstance(fname, basestring) \
             and os.path.exists(fname):
         with open(fname, "rb") as fh:
             for chunk in read_chunks(fh):
                 m.update(chunk)
     #上传的文件缓存 或 已打开的文件流
     elif fname.__class__.__name__ in ["StringIO", "StringO"] \
             or isinstance(fname, file):
         for chunk in read_chunks(fname):
             m.update(chunk)
     else:
         return ""     
     return m.hexdigest()

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值