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)

     

    朝闻道
  • 相关阅读:
    Linux学习40 运维必备技能-Linux软件包管理yum企业实战
    【Kafka】Kafka集群基础操作!新手上路必备~
    【Kafka】Kafka集群环境搭建
    【Kafka】消息队列相关知识
    【Hadoop离线基础总结】oozie的安装部署与使用
    【Hadoop离线基础总结】Hue与oozie集成
    【Hadoop离线基础总结】oozie定时任务设置
    【Hadoop离线基础总结】oozie任务串联
    【Hadoop离线基础总结】oozie调度MapReduce任务
    【Hadoop离线基础总结】oozie调度hive
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8492126.html
Copyright © 2011-2022 走看看