Flask框架中密码的加盐哈希加密和验证功能的用法详解

Flask框架中密码的加盐哈希加密和验证的用法详解

什么是加盐哈希加密

加盐哈希(Salted Hash)是一种安全的密码存储方式,也是现代密码学中最流行的方式之一。所谓哈希加密,就是通过一种数学算法将原始数据转换成一段唯一的、大小固定的字符串,即哈希值,也叫摘要值(Digest Value)。加盐哈希的意思是在原始数据的基础上,再加入一个随机字符串,称为盐(Salt),然后将二者一起进行哈希计算,最终得到哈希值。这样做的好处是,即使两个用户使用相同的密码,由于盐不同,生成的哈希值也不同,不容易通过预计算、字典攻击等方式进行破解。

在Flask框架中如何使用加盐哈希加密和验证

在Flask框架中,我们可以使用Werkzeug库中的security模块提供的密码哈希函数进行加盐哈希加密和验证。

下面是加密和验证的具体方法:

  1. 导入security模块
from werkzeug.security import generate_password_hash, check_password_hash
  1. 使用generate_password_hash函数进行加盐哈希加密,生成哈希值。该函数的参数是明文密码和盐,如果没有指定盐,则会自动生成一个。返回值是哈希值,可以保存到数据库中。
hash = generate_password_hash("password", salt_length=8)

其中,salt_length是盐的长度,默认为16个字符。

  1. 使用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技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Flaks基础之在URL中添加变量的实现详解

    下面我将详细讲解“Flask基础之在URL中添加变量的实现详解”的攻略,主要包括以下内容: 1. 如何在Flask中添加URL变量 在Flask中,我们可以在URL中通过添加变量来动态地生成不同的URL。具体实现方式是将需要带入变量的部分用尖括号(<>)包含起来,例如: @app.route(‘/user/<username>’) d…

    Flask 2023年5月16日
    00
  • Python的Flask框架中配置多个子域名的方法讲解

    下面我就为您讲解Python的Flask框架中配置多个子域名的方法以及两个示例说明。 配置多个子域名的方法讲解 在Flask中配置多个子域名需要用到Flask中的蓝图(Blueprint)。蓝图是 Flask 中一个很重要的概念,它提供了一种组织 Flask 应用的方式,可以让开发者把应用分成一些比较小的部分。 具体步骤: 首先,我们需要在Flask应用中定…

    Flask 2023年5月16日
    00
  • 哪些是python中web开发框架

    在Python中,有许多不同的Web框架可供选择。以下是其中一些最受欢迎和最流行的框架。 Flask:Flask是一个轻量级的Web应用程序框架,它是构建Web应用程序非常简单的框架之一。 Flask是使用Python并遵循Python哲学的核心原则之一:简单性。许多高度使用的Web应用程序都使用Flask,例如Pinterest,LinkedIn等。 Dj…

    Flask 2023年5月15日
    00
  • Docker Compose多容器部署的实现

    Docker Compose是一个强大的工具,可以在多个Docker容器之间协调并维护关系,实现复杂的应用程序部署。本攻略将介绍如何使用Docker Compose完成多容器部署。 步骤1:创建Docker Compose文件 首先,我们需要在本地创建一个名为docker-compose.yml的文件。这个文件将包含我们所有需要部署的Docker容器的配置。…

    Flask 2023年5月16日
    00
  • centos 7.0 使用Nginx部署flask应用教程

    这里是详细的“centos 7.0 使用Nginx部署flask应用教程”的完整攻略,其中包含两个示例说明。 环境准备 在开始我们的攻略之前,请确保你的服务器已经安装了Centos 7.0以及Nginx。 安装Python虚拟环境 我们首先需要创建一个Python虚拟环境,可以使用虚拟环境隔离来自不同项目的Python包。 我们可以使用以下命令安装虚拟环境:…

    Flask 2023年5月15日
    00
  • python flask之模板继承方式

    下面详细讲解 “Python Flask 之模板继承方式” 的完整攻略,包含两条示例说明。 模板继承 在 Flask 中,可以使用模板继承来简化模板的设计。模板继承是指创建一个基础模板,该模板包含应用程序中所有页面共享的公共部分,然后在单独的模板中使用基础模板作为一个模板,以便将其覆盖和拓展。这样,可以避免在每个单独的模板中反复编写共同的代码,提供了便利的灵…

    Flask 2023年5月15日
    00
  • python框架中flask知识点总结

    下面我将为您详细讲解“python框架中flask知识点总结”的完整攻略。 什么是Flask? Flask是一个基于Python的轻量级Web应用框架,由Armin Ronacher在2010年创建。Flask的核心是Werkzeug和Jinja2,Werkzeug负责提供Web应用的基本结构,Jinja2则负责模板渲染。 Flask的优点 Flask具有以…

    Flask 2023年5月15日
    00
  • 在Python的Flask框架中构建Web表单的教程

    在Python的Flask框架中构建Web表单可以通过Flask-WTF扩展实现。在这个教程中,我们将会通过两个示例说明如何构建Web表单,包括表单元素,表单验证和数据提交。 环境准备 在开始之前,请确保你已经在系统中安装了Python和Flask,以及Flask-WTF扩展。 你可以通过以下命令安装Flask和Flask-WTF: pip install …

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部