zoukankan      html  css  js  c++  java
  • Flask_generate_password_hash的加盐哈希加密算法与check_password_hash的校验

    密码加密简介

    密码存储的主要形式:

    • 明文存储:肉眼就可以识别,没有任何安全性。
    • 加密存储:通过一定的变换形式,使得密码原文不易被识别。

    密码加密的几类方式:

    • 明文转码加密算法:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。
    • 对称加密算法:DES, RSA等。
    • 签名加密算法:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容易被暴力破解。如果密码相同,得到的哈希值是一样的。
    • 加盐哈希加密算法:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运用这种加密方法。

    签名加密算法的风险

    签名加密算法的数据是无法被反解析成明文的,但因为加密算法的固定性(同样的字符串加密后哈希值是一样的),通过建立加密前后的映射关系,就能暴力破解加密后的哈希值。

    import hashlib
    
    password_map = {"e10adc3949ba59abbe56e057f20f883e": "123456"}   # 哈希值与明文映射表
    
    password = "123456" # 待加密明文
    
    # 加密明文
    _md5 = hashlib.md5()
    _md5.update(password.encode("utf-8"))
    p_md5 = _md5.hexdigest()
    print(f"md5加密后的值为:{p_md5},通过md5映射表暴力破解出加密后的密码明文为:{password_map.get(p_md5)}")

    加盐哈希加密算法

    加盐哈希加密算法的原理是在加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。

    import hashlib
    import random
    import string
    
    
    def generate_salt_hash(s: str):
        # 随机生成长度为4的盐值
        salt = "".join([random.choice(string.ascii_lowercase) for i in range(4)])
    
        # 拼接原始密码和盐值
        s = s + salt
    
        # 对加入盐值的字符串加密
        _md5 = hashlib.md5()
        _md5.update(s.encode("utf-8"))
        return salt + "$" + _md5.hexdigest()    # 返回 盐值+哈希值 的字符串
    
    
    # 原始密码
    password = "123456"
    
    p_md5_1 = generate_salt_hash(password)
    p_md5_2 = generate_salt_hash(password)
    print(p_md5_1)
    print(p_md5_2)

    Flask中的密码加密和验证

    flask中主要用werkzeug.security 包中的generate_password_hash函数对密码进行加密,以及check_password_hash函数用于验证经过generate_password_hash哈希的密码

    generate_password_hash函数语法:

    generate_password_hash(password, method="pbkdf2:sha256", salt_length=8)

    参数说明:

    • password:明文密码
    • method:加密的方式(需要是hashlib库支持的),格式为:pbkdf2:method:iterations,其中method为加密加密方式,比如md5,sha1,默认为sha256,iterations为迭代次数
    • slat_length:盐值的长度,默认为8。

    生成的hash值格式如下:

    method$salt$hash

    check_password_hash函数语法:

    check_password_hash(pwhash, password)

    参数说明:

    • pwhash: generate_password_hash生成的哈希字符串
    • password: 需要验证的明文密码
    from werkzeug.security import generate_password_hash, check_password_hash
    
    # 明文密码
    password = "123456"
    
    # 生成加密哈希值
    p_hash = generate_password_hash(password)
    print(p_hash)
    
    # 验证密码
    ret = check_password_hash(p_hash, password)
    print(ret)
    
    ret = check_password_hash(p_hash, "afdasfsda")
    print(ret)

  • 相关阅读:
    高性能无锁队列,代码注释
    阿里mysql同步工具otter的docker镜像
    webgl鱼眼算法
    国际网络环境对库的影响
    newlisp
    java面试之数据库
    java面试之遇到过的问题
    java面试之springboot
    git常用命令
    java面试之jenkins
  • 原文地址:https://www.cnblogs.com/testlearn/p/14328143.html
Copyright © 2011-2022 走看看