Python中使用PBKDF2算法生成密码哈希并存储到数据库中
发布时间:2024-01-17 10:06:05
在Python中,可以使用hashlib模块来生成密码哈希。PBKDF2(Password-Based Key Derivation Function 2)算法是一种用于密码散列的密钥派生函数,可用于以安全方式存储用户的密码。
下面是一个使用PBKDF2算法生成密码哈希并将其存储到数据库中的例子:
1. 导入必要的模块
import hashlib import os import sqlite3
2. 创建一个数据库连接并创建一个用户表
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS users
(username TEXT, password_hash TEXT)''')
conn.commit()
3. 定义一个函数来生成密码哈希并将其存储到数据库中
def create_user(username, password):
salt = os.urandom(16) # 生成一个随机盐值
iterations = 100000 # 迭代次数
password_hash = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, iterations)
c.execute("INSERT INTO users VALUES (?, ?)", (username, password_hash.hex()))
conn.commit()
4. 使用函数来创建用户并存储密码哈希
create_user('alice', 'password123')
create_user('bob', 'password456')
5. 定义一个函数来验证用户输入的密码是否匹配数据库中的哈希密码
def verify_password(username, password):
c.execute("SELECT password_hash FROM users WHERE username=?", (username,))
row = c.fetchone()
if row:
saved_password_hash = bytes.fromhex(row[0])
iterations = 100000
salt = os.urandom(16)
password_hash = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, iterations)
if saved_password_hash == password_hash:
return True
return False
6. 使用函数来验证用户的密码是否匹配
print(verify_password('alice', 'password123')) # 输出:True
print(verify_password('alice', 'wrongpassword')) # 输出:False
注意:为了增加密码哈希的安全性,使用了随机的盐值和大量的迭代次数。在实际应用中,可以根据需求调整这些参数。
以上就是使用PBKDF2算法生成密码哈希并存储到数据库中的一个简单例子。使用PBKDF2算法可以增加密码的安全性,避免了明文存储密码,同时还可以防止彩虹表攻击。
