Flask框架中密码的加盐哈希加密和验证的用法详解
什么是加盐哈希加密
加盐哈希(Salted Hash)是一种安全的密码存储方式,也是现代密码学中最流行的方式之一。所谓哈希加密,就是通过一种数学算法将原始数据转换成一段唯一的、大小固定的字符串,即哈希值,也叫摘要值(Digest Value)。加盐哈希的意思是在原始数据的基础上,再加入一个随机字符串,称为盐(Salt),然后将二者一起进行哈希计算,最终得到哈希值。这样做的好处是,即使两个用户使用相同的密码,由于盐不同,生成的哈希值也不同,不容易通过预计算、字典攻击等方式进行破解。
在Flask框架中如何使用加盐哈希加密和验证
在Flask框架中,我们可以使用Werkzeug库中的security模块提供的密码哈希函数进行加盐哈希加密和验证。
下面是加密和验证的具体方法:
- 导入security模块
from werkzeug.security import generate_password_hash, check_password_hash
- 使用generate_password_hash函数进行加盐哈希加密,生成哈希值。该函数的参数是明文密码和盐,如果没有指定盐,则会自动生成一个。返回值是哈希值,可以保存到数据库中。
hash = generate_password_hash("password", salt_length=8)
其中,salt_length是盐的长度,默认为16个字符。
- 使用check_password_hash函数进行验证,检查输入的密码和保存在数据库中的哈希值是否匹配。该函数的参数是哈希值和明文密码。返回值为True或False。
result = check_password_hash(hash, "password")
如果密码正确,则result为True,否则为False。
示例1:用户注册和登录时使用加盐哈希加密
下面是一个用户注册和登录的示例代码。在数据库中保存用户的用户名和密码哈希值。用户输入的密码使用generate_password_hash函数进行加密,然后和用户名一起保存到数据库中。用户登录时输入用户名和密码,从数据库中取出哈希值,使用check_password_hash函数进行验证。
from flask import Flask, render_template, request, session
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.secret_key = "your_secret_key" # 设置session的密钥
users = { # 模拟用户数据库
"alice": generate_password_hash("alice_password", salt_length=8),
"bob": generate_password_hash("bob_password", salt_length=8)
}
@app.route("/")
def index():
return render_template("index.html")
@app.route("/register", methods=["GET", "POST"])
def register():
if request.method == "GET":
return render_template("register.html")
elif request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if username in users:
return "该用户名已经被注册!"
else:
hash = generate_password_hash(password, salt_length=8)
users[username] = hash
return "注册成功!"
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template("login.html")
elif request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if username not in users:
return "该用户名不存在!"
elif check_password_hash(users[username], password):
session["username"] = username # 登录成功,保存用户名到session中
return "登录成功!"
else:
return "密码错误!"
@app.route("/logout")
def logout():
session.pop("username", None)
return "注销成功!"
if __name__ == "__main__":
app.run(debug=True)
上述代码中,register函数中的hash值是使用generate_password_hash函数生成的密码哈希值,保存到了users字典中。login函数中的check_password_hash函数使用了users字典中保存的哈希值进行验证。
登录成功后,将用户名保存到session中,方便后续页面判断用户是否已经登录。
示例2:Flask-Login扩展中的密码处理功能
Flask-Login是一个常用的用户认证和管理扩展,可以方便地实现注册、登录、注销等功能。其中就包含了密码加密和验证的功能。
下面是一个使用Flask-Login扩展的示例代码。登录时输入用户名和密码,Flask-Login会自动从数据库中获取密码哈希值,并使用check_password_hash函数进行验证。
from flask import Flask
from flask_login import LoginManager, UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config["SECRET_KEY"] = "your_secret_key"
login_manager = LoginManager(app)
login_manager.login_view = "login"
class User(UserMixin):
def __init__(self, username, password_hash):
self.username = username
self.password_hash = password_hash
def get_id(self):
return self.username
users = [ # 模拟用户数据库
User("alice", generate_password_hash("alice_password", salt_length=8)),
User("bob", generate_password_hash("bob_password", salt_length=8))
]
@login_manager.user_loader
def load_user(username):
for user in users:
if user.username == username:
return user
return None
if __name__ == "__main__":
app.run(debug=True)
上述代码中,User类继承了UserMixin类,实现了get_id方法和其他方法,可以用来表示一个用户对象。users是一个模拟的用户数据库,保存了两个用户的信息。
@login_manager.user_loader是一个Flask-Login扩展提供的装饰器,用来装饰一个函数,实现从数据库中根据用户名获取用户对象的功能。在load_user函数中,先遍历users列表,如果找到用户名匹配的用户,则返回该用户对象。如果遍历完整个列表,还没有找到匹配的用户,则返回None。
使用Flask-Login时,在用户登录成功后,会将用户对象保存到session中,方便后续页面访问用户信息。可以在视图函数中使用current_user获取当前用户对象。例如,在一个需要用户登录才能访问的视图函数中,可以使用以下代码进行判断:
from flask_login import current_user, login_required
@app.route("/profile")
@login_required
def profile():
username = current_user.username
return "欢迎,%s!" % username
上述代码中,@login_required是一个Flask-Login提供的装饰器,它可以判断用户是否已经登录,如果未登录,则跳转到登录页面。如果已经登录,则执行视图函数中的代码。可以使用current_user获取当前用户对象,从而获取用户信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask框架中密码的加盐哈希加密和验证功能的用法详解 - Python技术站