欢迎访问宙启技术站
智能推送

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算法可以增加密码的安全性,避免了明文存储密码,同时还可以防止彩虹表攻击。