zoukankan      html  css  js  c++  java
  • hashlib模块

    摘要算法
    就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,
    目的是为了发现原始数据是否被人篡改过。

    摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,
    计算f(data)很容易,
    但通过digest反推data却非常困难。
    而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。


    计算出一个字符串的MD5值:

    import hashlib

    md5 = hashlib.md5()
    md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
    print(md5.hexdigest())
    计算结果如下:

    d26a53750bc40b38b65a520292f69306


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


    另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

    import hashlib

    sha1 = hashlib.sha1()
    sha1.update('how to use sha1 in '.encode('utf-8'))
    sha1.update('python hashlib?'.encode('utf-8'))
    print(sha1.hexdigest())


    摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改


    根据用户输入的口令,计算出存储在数据库中的MD5口令:


    import hashlib


    db = {
    'michael': 'e10adc3949ba59abbe56e057f20f883e',
    'bob': '878ef96e86145580c38c87f0410ad153',
    'alice': '99b1c2188db85afee403b1536010c2c9'
    }


    def calc_md5(password):
    md5 = hashlib.md5()
    md5.update(password.encode('utf-8'))
    return md5.hexdigest()


    def login(user, password):
    if user in db.keys():
    if db[user] == calc_md5(password):
    return True
    return False

     

    assert login('michael', '123456')
    assert login('bob', 'abc999')
    assert login('alice', 'alice2008')
    assert not login('michael', '1234567')
    assert not login('bob', '123456')
    assert not login('alice', 'Alice2008')
    print('ok')

    根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5:

    # -*- coding: utf-8 -*-
    import hashlib, random


    def get_md5(s):
    return hashlib.md5(s.encode('utf-8')).hexdigest()


    class User(object):
    def __init__(self, username, password):
    self.username = username
    self.salt = ''.join([chr(random.randint(48, 122)) for i in range(20)])
    self.password = get_md5(password + self.salt)


    db = {}
    def register(username, password):
    db[username] = User(username, password)
    return True

    def login(username, password):
    # 对象 User=db[username] 有三个属性:
    # db[username].password
    # db[username].salt
    # db[username].username
    user = db[username]
    return user.password == get_md5(password + user.salt)


    assert register('michael', '123456')
    assert register('bob', 'abc999')
    assert register('alice', 'alice2008')


    assert login('michael', '123456')
    assert login('bob', 'abc999')
    assert login('alice', 'alice2008')
    assert not login('michael', '1234567')
    assert not login('bob', '123456')
    assert not login('alice', 'Alice2008')
    print('ok')

    根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5:

    import hashlib, random

    def get_md5(s):
    return hashlib.md5(s.encode('utf-8')).hexdigest()

    class User(object):
    def init(self, username, password):
    self.username = username
    self.salt = ''.join([chr(random.randint(48, 122)) for i in range(20)])
    self.password = get_md5(password + self.salt)
    db = {
    'michael': User('michael', '123456'),
    'bob': User('bob', 'abc999'),
    'alice': User('alice', 'alice2008')
    }

    def login(username, password):
    user = db[username]
    return user.password == get_md5(password + user.salt)

     

    朝闻道
  • 相关阅读:
    process crashed and the client did not handle it, not reloading the page because we reached the maximum number of attempts
    mac 查看ip
    axios和vue-axios的关系
    export default 和 export 区别
    Mac 编辑hosts文件
    npm --save-dev --save 的区别
    CommonHelper 公共类
    2.06StuModify.aspx(修改姓名,性别,所在班级)
    linux网桥浅析
    Bridge的数据在内核处理流程
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8492126.html
Copyright © 2011-2022 走看看