从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

38、 hashlib加密模块

发布:蔺要红05-27分类: Python


加密算法介绍

HASH

Hash,—般翻译做“散列”,也有直接音译为”哈希"的,就是把任意长度的输入(又叫做预映射,preimage)
, 通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就
是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一
的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH主要用于信息安全领域中加密篝法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH
值.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系


MD5

什么是MD5算法

      MD5摘要算法(英语:MD5 Message-Digest Algorithm), —种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。

MD5功能

      输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)
      不同的输入得到的不同的结果(唯一性)


MD5算法的特点

    1. 压缩性:任恿长度的数据,箄出的MD5值的长度都是固定的
    2. 容易计篝:从原数据计箅出MD5值很容易
    3. 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
    4. 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。


MD5算法不可逆:

     MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

MD5用途

1.防止被篡改:

   比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b—样就代表中途未被篡改。
   比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。
   SVN在检测文件是否在Checkout后被修改过,也是用到了MD5.


2.防止直接看到明文: 

       现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNW系统中用户的密码就是以 MD5 (或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密 码被破解的难度。)  

3.防止抵赖(数字签名):

        这需要个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并 做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录 在册的摘要信息逬行比对,相同的话,就证明是A写的了。这就是所谓的"数字签名”。

 
# -*- coding:utf-8 -*-
#MD5是基于Hash的
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"linyaohong")
>>> m.hexdigest()
'5a77d5a3500d93ab62541bb31f4d5055'
#重新退出程序再来一遍得到的结果是一样的
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("linyaohong".encode("utf-8"))
>>> m.hexdigest()
'5a77d5a3500d93ab62541bb31f4d5055'

#不退出继续加密的结果

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"admin")
>>> m.hexdigest()
'21232f297a57a5a743894a0e4a801fc3' #admin
#没有重新赋值 m 和重新赋值 m的区别
>>> m.update(b"123456")
>>> m.hexdigest()
'a66abb5684c45962d887564f08346e8d' #admin123456 
#注意区别
>>> m = hashlib.md5()
>>> m.update(b"123456")
>>> m.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'  #123456
 
#userinfo文件内容

lin|5a77d5a3500d93ab62541bb31f4d5055|python
 
# -*- coding:utf-8 -*-
import hashlib
usr =input("username: ")
pwd = input("password: ")
with open("userinfo") as f:
    for line in f:
        user,passwd,role = line.split("|")
        #md5 = hashlib.md5(bytes('salt',encoding="utf-8")) #加盐
        md5 = hashlib.md5()
        #md5.update(pwd.encode('utf-8'))
        md5.update(bytes(pwd,encoding="utf-8"))
        md5_pwd = md5.hexdigest()
        if usr == user and md5_pwd == passwd:
            print("登陆成功")
        else:
            print("登陆失败")

#D:\python\python.exe F:/运维笔记/python/day28面向对象进阶/hashlib模块.py
username: lin
password: linyaohong
登陆成功
 
#加盐
import hashlib #提供摘要算法的模块
md5 = hashlib.md5()
md5.update(b'linyaohong')
print(md5.hexdigest())
import hashlib
md5 = hashlib.md5(bytes('salt',encoding="utf-8")) #加盐
md5.update(b'linyaohong')
print(md5.hexdigest())
import hashlib
md5 = hashlib.md5()
md5.update(b'saltlinyaohong')
print(md5.hexdigest())

# 动态加盐
# 用户名 密码
# 使用用户名的一部分或者直接使用整个用户名作为盐

#D:\python\python.exe F:/运维笔记/python/day28面向对象进阶/hashlib模块.py
5a77d5a3500d93ab62541bb31f4d5055
58acd86b272ba432f16a5236364ba7ac
58acd86b272ba432f16a5236364ba7ac
 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站