(内部模块)hashlib

作者: sixleaves | 来源:发表于2016-05-30 23:40 被阅读222次
    # Python的hashlib提供了常见的摘要算法.如MD5, SHA1等.
    # 摘要算法, 又称为哈希算法, 散列算法.它通过一个函数, 把任意长度的数据转换为一个长度固定的字符串.
    # 通常用16进制的字符串来表示.
    # 摘要算法主要应用在判断数据有没有被篡改过.因为摘要函数是一个单向的函数,计算f(data)很容易.反之非常困难.
    
    import hashlib
    
    md5 = hashlib.md5()
    md5.update('how to user md5 in python hashlib?'.encode('utf-8'))
    print(md5.hexdigest())
    
    # 如果数据量很大, 可以很多次调用update方法.
    # MD5是最常见的摘要算法, 速度很快.生成固定的128bit==> 每4bit可以表示成一个16进制数, 所以128 / 4 = 32个16进制数
    # 所以通常用一个32个字符的16进制字符串表示.
    # 通常用32个字符的16进制字符串表示.记住其实128位!!!.
    
    # SHA1与MD5类似, 其生成固定的160bit字节.通常用一个40个字符的16进制表示.
    # 比SHA1更加安全的算法是SHA256, SHA512.不过越安全,算法越慢.而且摘要越长.
    sha1 = hashlib.sha1()
    sha1.update('how to use sha1 in '.encode('utf-8'))
    sha1.update('python hashlib?'.encode('utf-8'))
    print(sha1.hexdigest())
    
    # 摘要算法应用
    # 摘要算法能应用到什么地方.如允许用户登入的网站
    # 都会存储用户名和口令.方法是存到数据库中.如果用明文保存用户口令, 一旦数据库泄露,就没有安全可言
    # 正确的保存口令的方式是存储用户口令的摘要.当用户登入的时候, 首先计算用户输入的明文口令MD5.然后
    # 和数据库中的MD5做比较.如果一致, 说明口令正确.如果不一致, 说明口令错误.
    
    # 更进一步, 通常用户口令的MD5值是很容易被计算出来的, 所以确保存储的用户口令不是哪些被计算出的常用口令的MD5, 这一方法通过对原始口令
    # 加一个复杂的字符串来实现, 俗称'加盐'.
    # def calc_md5(password):
    #   return get_md5(password + 'the-Salt')
    #
    # 只要Salt不被黑客知道, 即使用户输入简单的口令, 也很难通过MD5反推出明文.
    
    #Question: 如果两个用户使用了相同的简单口令, 比如123456.在数据库宏将存储两个一样的MD5
    # 有没有办法使用相同的口令存储不同的MD5.
    # 这是有前提的, 前提就是用户名是唯一的, 那么我们可以通过把登入名最为哦Salt的一部分来计算MD5.
    # 从而实现相同的口令的用户存储不同的MD5.
    # 练习: 根据用户输入的登入名和口令模拟用户的注册, 计算更加安全的MD5
    db = {}
    
    salt = 'sixleaves'
    def get_md5(salted_string):
        md5 = hashlib.md5()
        md5.update(salted_string.encode('utf-8'))
        return md5.hexdigest()
    
    def register(username, password):
        db[username] = get_md5(password + username + salt)
    
    def login(username, password):
        md5digest = get_md5(password + username + salt)
        md5digest_in_db = db[username]
        if md5digest == md5digest_in_db:
            print('welcome my lord!')
        else:
            print('login failed!')
    
    register('suweipeng', '123456')
    login('suweipeng', '123456')
    
    
    

    相关文章

      网友评论

        本文标题:(内部模块)hashlib

        本文链接:https://www.haomeiwen.com/subject/nascdttx.html