zoukankan      html  css  js  c++  java
  • Python3标准库:hashlib密码散列

    1. hashlib密码散列

    hashlib模块定义了一个API来访问不同的密码散列算法。要使用一个特定的散列算法,可以用适当的构造器函数或new()来创建一个散列对象。不论使用哪个具体的算法,这些对象都使用相同的API。

    1.1 散列算法

    由于hashlib有OpenSSL提供“底层支持”,所以OpenSSL库提供的所有算法都可用,包括:

    md5

    sha1

    sha224

    sha256

    sha384

    sha512

    有些算法在所有平台上都可用,而有些则依赖于底层库。这两种算法分别由algorithms_guaranteed和algorithms_available提供。

    import hashlib
    
    print('Guaranteed:
    {}
    '.format(
        ', '.join(sorted(hashlib.algorithms_guaranteed))))
    print('Available:
    {}'.format(
        ', '.join(sorted(hashlib.algorithms_available))))
    Guaranteed:
    blake2b, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256
    
    Available:
    DSA, DSA-SHA, MD4, MD5, RIPEMD160, SHA, SHA1, SHA224, SHA256, SHA384, SHA512, blake2b, blake2s, dsaEncryption, dsaWithSHA, ecdsa-with-SHA1, md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256, whirlpool

    1.2 MD5示例

    要为一个数据块(在这里就是转换为一个字节串的Unicode串)计算MD5散列或摘要,首先要创建散列对象,然后增加数据,最后调用digest()或hexdigest()。

    import hashlib
    
    lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
    elit, sed do eiusmod tempor incididunt ut labore et dolore magna
    aliqua. Ut enim ad minim veniam, quis nostrud exercitation
    ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
    aute irure dolor in reprehenderit in voluptate velit esse cillum
    dolore eu fugiat nulla pariatur. Excepteur sint occaecat
    cupidatat non proident, sunt in culpa qui officia deserunt
    mollit anim id est laborum.'''
    
    h = hashlib.md5()
    h.update(lorem.encode('utf-8'))
    print(h.hexdigest())

    这个例子使用了hexdigest()方法而不是digest(),因为要格式化输出以便清楚的打印。如果可以接受二进制摘要值,那么可以使用digest()。

    1.3 SHA1示例

    SHA1摘要也用同样的方式计算。 

    import hashlib
    
    lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
    elit, sed do eiusmod tempor incididunt ut labore et dolore magna
    aliqua. Ut enim ad minim veniam, quis nostrud exercitation
    ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
    aute irure dolor in reprehenderit in voluptate velit esse cillum
    dolore eu fugiat nulla pariatur. Excepteur sint occaecat
    cupidatat non proident, sunt in culpa qui officia deserunt
    mollit anim id est laborum.'''
    
    h = hashlib.sha1()
    h.update(lorem.encode('utf-8'))
    print(h.hexdigest())

    这个例子中的摘要值有所不同,因为MD5和SHA1算法不同。

    1.4 增量更新

    散列计算器的update()方法可以反复调用。每次调用时,都会根据提供的附加文本更新摘要。增量更新比将整个文件读入内存更高效,而且能生成相同的结果。

    import hashlib
    
    lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
    elit, sed do eiusmod tempor incididunt ut labore et dolore magna
    aliqua. Ut enim ad minim veniam, quis nostrud exercitation
    ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
    aute irure dolor in reprehenderit in voluptate velit esse cillum
    dolore eu fugiat nulla pariatur. Excepteur sint occaecat
    cupidatat non proident, sunt in culpa qui officia deserunt
    mollit anim id est laborum.'''
    
    h = hashlib.md5()
    h.update(lorem.encode('utf-8'))
    all_at_once = h.hexdigest()
    
    def chunkize(size, text):
        "Return parts of the text in size-based increments."
        start = 0
        while start < len(text):
            chunk = text[start:start + size]
            yield chunk
            start += size
        return
    
    h = hashlib.md5()
    for chunk in chunkize(64, lorem.encode('utf-8')):
        h.update(chunk)
    line_by_line = h.hexdigest()
    
    print('All at once :', all_at_once)
    print('Line by line:', line_by_line)
    print('Same        :', (all_at_once == line_by_line))

    这个例子展示了读取或生成数据时如何以增量方式更新一个摘要。

  • 相关阅读:
    组合算法问题
    递归之全排列问题
    递归之整数划分问题
    利用Python完成一个小游戏:随机挑选一个单词,并对其进行乱序,玩家要猜出原始单词
    对数组元素进行排序的方法总结(利用C++)
    用c++语言编写函数 int index(char *s,char * t),返回字符串t在字符串s中出现的最左边的位置,如果s中没有与t匹配的子串,则返回-1。类似于索引的功能。
    用MFC完成一个简单的猜数字游戏: 输入的四位数中,位置和数字都正确为A,数字相同而位置不同的为B。
    用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
    利用matlab实现以下功能:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
    白书_倒三角形_C语言描述
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/12588244.html
Copyright © 2011-2022 走看看