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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM