zoukankan      html  css  js  c++  java
  • Python学习笔记:MD5加密

    MD5 算法严格上来说,不算是一种加密算法,而是一种哈希算法。

    MD5 中没有密钥和密文的概念,没有解密一说。

    MD5 是一种有损压缩,非对称加密算法,无法进行还原。

    网上关于 MD5 的解密大部分都是码表匹对,而不是破解。

    Python3 标准库中,已经移除了 md5, 关于 hash 加密算法都放在 hashlib 标准库中,例如:SHA1/SHA224/SHA256/SHA384/SHA512MD5 算法等。

    hashlib 库的 hash 算法中,提供众多加密算法:

    sha1()
    sha224()
    sha256()
    sha384()
    sha512()
    blake2b()
    blake2s()
    md5()
    

    这些方法通过统一接口返回一个对象。

    一、针对英文md5加密

    # 方法一
    import hashlib
    m = hashlib.md5()
    m.update(b'123')
    m.hexdigest() # '202cb962ac59075b964b07152d234b70'
    
    # 方法二
    hashlib.md5(b'123').hexdigest() # '202cb962ac59075b964b07152d234b70'
    
    # 方法三
    hashlib.new('md5', b'123').hexdigest() # '202cb962ac59075b964b07152d234b70'
    

    二、针对中文md5加密

    需先将中文转换成 UTF-8 格式,再进行 md5 加密。

    import hashlib
    data = r'你好'
    hashlib.md5(data.encode(encoding='UTF-8')).hexdigest() # '7eca689f0d3389d9dea66ae112e5cfd7'
    '''
    encoding='UTF-8'
    encoding='GBK'
    encoding='GB2312'
    encoding='GB18030'
    '''
    

    三、hashlib函数解析

    1.hashlib.new方法

    一般性方法,使用语法为:

    hashlib.new(name, [data])
    # name 哈希加密算法名称 例如:md5
    # data 需要加密的数据 可忽略 在之后update时传入数据即可
    

    实例:

    import hashlib
    m = hashlib.new('md5')
    m.update(b'123')
    m.hexdigest() # '202cb962ac59075b964b07152d234b70'
    

    2.hashlib.algorithms_guaranteed/algorithms_available方法

    可以使用 hashlib.algorithms_guaranteed 或者 hashlib.algorithms_available 这两个内置属性查看 hashlib 支持哪些加密算法。

    hashlib.algorithms_guaranteedhashlib.algorithms_available 的子集。

    import hashlib
    hashlib.algorithms_guaranteed
    {'blake2b',
     'blake2s',
     'md5',
     'sha1',
     'sha224',
     'sha256',
     'sha384',
     'sha3_224',
     'sha3_256',
     'sha3_384',
     'sha3_512',
     'sha512',
     'shake_128',
     'shake_256'}
    
    import hashlib
    hashlib.algorithms_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'}
    

    3.hashlib.update方法

    传入参数对象以更新哈希对象。

    该方法只支持 byte 类型,否则会报错。

    需要在参数前添加 b 进行类型转换。

    import hashlib
    m = hashlib.md5()
    m.update('123456')
    # TypeError: Unicode-objects must be encoded before hashing
    
    m.update(b'123456')
    

    重复调用 update(arg) 方法,会将传入的 arg 参数进行拼接,而不是覆盖。

    m.update(a); m.update(b) 等价于 m.update(a+b)

    import hashlib
    m = hashlib.md5()
    m.update(b'123')
    m.hexdigest() # '202cb962ac59075b964b07152d234b70'
    m.update(b'456')
    m.hexdigest() # 'e10adc3949ba59abbe56e057f20f883e'
    
    hashlib.md5(b'123456').hexdigest() # 'e10adc3949ba59abbe56e057f20f883e'
    

    为了防止每次拼接干扰,每次都需要重新实例化。

    重新定义:md5 = hashlib.md5()

    4.hashlib.hexdigest方法

    hex 代表十六进制。

    该方法将 hash 中的数据转换成数据格式,其中只包含十六进制的数字。

    四、针对DataFrame某列进行加密

    先构造函数,再针对该列进行 apply 操作。

    import hashlib
    
    def md5_crypt(txt):
        m = hashlib.md5()
        m.update(str(txt).encode()) # 转换为字符型 b
        return m.hexdigest()
    
    data['nes_col'] = data['col'].apply(md5_crypt)
    

    参考链接:python3中的md5加密

    参考链接:python中的md5加密

    参考链接:Python之md5.update才过的哪些坑

    参考链接:Python中如何对某一段字符串进行md5加密

  • 相关阅读:
    完整的开源和商业软件平台
    免费开源的文件比较/合并工具
    Javascript面向对象基础
    Javascript面向对象基础
    引入外部js获取dom为null的问题
    闭包函数
    初识对象
    构造函数
    内置对象
    Math对象
  • 原文地址:https://www.cnblogs.com/hider/p/15404859.html
Copyright © 2011-2022 走看看