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)

     

    朝闻道
  • 相关阅读:
    llinux文件相关指令
    移除元素【数组专题】
    移动零【数组专题】
    删除数组中重复的元素plus【数组专题】
    TCP超时重传时间的选择
    linux帮助指令
    各种缩写
    MyEclipse开发WebService教程(转)
    RMI 自己创建的 过程
    RMI简单实例 (转)
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8492126.html
Copyright © 2011-2022 走看看