专栏首页python3python hashlib模块算法

python hashlib模块算法

hashlib模块

python中的hashlib为我们提供了常见的摘要算法,如MD5、sha1

那么现在问题来了,摘要算法what?

摘要算法又称哈希算法、散列算法。

它指的是把任意长度的数据data,通过函数f(),转换为一个长度固定的摘要digest(通常用16进制的字符串表示),

目的是为了发现原始的数据是否被人篡改过。

摘要算法之所以可以辨别数据是否被人篡改过,就是因为摘要函数是一个单向函数,

想要计算f(data)很容易,但是通过digest反推data却非常困难。

并且,只要是对原始数据做哪怕一点点改动,都会导致计算出的摘要截然不同。

接下来我们以常见的摘要算法MD5为例,

#计算出一个字符串的MD5值
import hashlib
md5 = hashlib.md5()
md5.update(b'hello,python')  #ps:需要转换成b字节或者encode('utf-8')
print(md5.hexdigest())

输出结果:

15ac32041ff74c93c1842b152df7519e

import hashlib
md5 = hashlib.md5()
md5.update('hello,python'.encode('utf-8'))
print(md5.hexdigest())

输出结果:

15ac32041ff74c93c1842b152df7519e

如果数据量很大,可以分块多次调用update(),

一段字符串分成几段摘要和直接进行摘要的结果是相同的

import hashlib
md5 = hashlib.md5()
md5.update(b'hello,')        #原字符串中有逗号的不要忘记了
md5.update(b'python')
print(md5.hexdigest())

输出结果:

15ac32041ff74c93c1842b152df7519e

模仿文件校验

import hashlib
def check_md5(filename):
    md5 = hashlib.md5()
    with open(filename,'rb') as f:
        while True:
            content = f.read(2048)    #分段读取,以免占用大段内存
            if content:
                md5.update(content)
            else:
                break
    return md5.hexdigest()
file1 = check_md5('md5_test1')  #我创建的md5_test1中的数据为11112
file2 = check_md5('md5_test2')   #我创建的md5_test2中的数据为11111
print(file1)
print(file2)

输出结果:

afcb7a2f1c158286b48062cd885a9866 b0baee9d279d34fa1dfd71aadb908c3f

md5摘要加密传输进来的密码,并动态加盐提高安全性

import hashlib
def md5_digest(salt,pwd):
    md5 = hashlib.md5(salt.encode('utf-8'))  #salt,加盐操作,增加安全性,而且还可以对盐进行切片进一步增加安全性如salt[::-1]
    md5.update(pwd.encode('utf-8'))
    return md5.hexdigest()

salt = '盐'
pwd = '123450'
print(md5_digest(salt,pwd))

输出结果:

684d41d1f7512e40a8939fd4fed9518a

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。 另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全一样,就是将前面的md5改成sha1而己。 SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。 比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python之md5.update才过的

    经过测试发现 md5.update  会将每次字符串拼接,我们看下 “123123”的结果如下:

    py3study
  • Python 实现MD5加密

    py3study
  • python的md5模块使用非常简单

    2.[fengyj@fengyj python]$ ./md.py fengyajie

    py3study
  • Python之md5.update才过的

    经过测试发现 md5.update  会将每次字符串拼接,我们看下 “123123”的结果如下:

    py3study
  • haslib 模块

    一、模块简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任...

    人生不如戏
  • [BJDCTF2020]Easy MD5题解

    这里用到了一个关于md5的知识点,可参考实验吧后台注入一题。PHP中md5函数如果第二个参数设为true,返回的是二进制内容,如果能恰好凑出类似'or的字符串,...

    KevinBruce
  • 用PHP做最简单的MD5生成小程序

    Alone88
  • Java并发学习之Volatile及内存模型探究

    volatile工作原理 java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言...

    一灰灰blog
  • Java奇淫巧技之Lombok

    Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官...

    試毅-思伟
  • LeetCode - 合并两个有序链表

    原题地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/

    晓痴

扫码关注云+社区

领取腾讯云代金券