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日

相关文章

  • 一个基于flask的web应用诞生 记录用户账户登录状态(6)

    以下是“一个基于flask的web应用诞生 记录用户账户登录状态(6)”的完整攻略: 1. 添加用户注销功能 在用户登录成功后,我们需要给出注销的入口。在html文件中添加以下代码,链接到注销路由: {% if current_user.is_authenticated %} <li class="nav-item"> &lt…

    Flask 2023年5月15日
    00
  • flask+layui+echarts实现前端动态图展示数据效果

    下面是使用Flask、LayUI和ECharts实现前端动态数据展示效果的完整攻略,包含两个示例。 步骤一:安装并配置Flask 安装Flask:在命令行窗口中输入pip install Flask即可安装。 创建Flask应用:在项目文件夹中创建一个名为app.py的Python文件,并编写代码: “`python from flask import F…

    Flask 2023年5月16日
    00
  • 一个基于flask的web应用诞生 flask和mysql相连(4)

    下面来详细讲解“一个基于flask的web应用诞生 flask和mysql相连(4)”的完整攻略,并且包含两条示例说明。 标题 一、前言 在建立web应用的时候,数据的处理是非常重要的一项任务,而flask本身只是一个web应用框架,并不具备直接处理关系型数据库的能力,需要借助mysql等数据库来进行数据的存取操作。而本篇攻略将讲解如何基于flask框架来实…

    Flask 2023年5月15日
    00
  • 详解Flask数据库的连接与使用

    为了详细讲解Flask数据库的连接与使用的攻略,我们需要分为以下几个步骤: 1. 安装Flask扩展 在使用Flask之前,我们需要先安装一些必要的扩展。对于连接数据库来说,常用的扩展是Flask-SQLAlchemy和Flask-MySQLdb。 pip install flask_sqlalchemy pip install flask-mysqldb …

    Flask 2023年5月15日
    00
  • Flask框架使用DBUtils模块连接数据库操作示例

    实现连接数据库 首先需要安装需要的模块。可以通过以下命令安装: pip install Flask pip install DBUtils pip install mysql-connector-python 然后在项目文件夹下创建配置文件config.py,包含以下代码: DATABASE = { ‘host’: ‘localhost’, ‘databas…

    Flask 2023年5月15日
    00
  • python3-flask-3将信息写入日志的实操方法

    下面我来详细讲解“python3-flask-3将信息写入日志的实操方法”的完整攻略。 1. 简介 在Flask应用程序中,日志可以帮助我们快速找到应用程序的问题。在日志中记录的对应的信息,有助于我们更快的定位问题并进行修复。在本文中,我们将会详细介绍如何将信息写入日志。在实现本案例时,我们会使用Python3、Flask框架,下面是示例代码。 2. 实现 …

    Flask 2023年5月15日
    00
  • vue+flask实现视频合成功能(拖拽上传)

    下面是详细讲解“vue+flask实现视频合成功能(拖拽上传)”的完整攻略。 总体思路 这个项目的目的是实现用户可以通过拖拽上传多个视频文件,并将这些视频文件拼接成一个新的视频文件自定义保存,同时该视频文件可以在前端进行预览播放。 具体的实现方案是:前端使用vue框架构建视图,并使用dropzone.js插件实现文件的拖拽上传;后端使用flask框架运行py…

    Flask 2023年5月16日
    00
  • 详解python使用Nginx和uWSGI来运行Python应用

    下面我来详细讲解“详解python使用Nginx和uWSGI来运行Python应用”的完整攻略。 简介 在 Linux 系统中,Nginx 是一个高性能的 Web 服务器/反向代理服务器,而 uWSGI 是一个支持多种协议的 Web 服务容器,它可以让我们轻松地将 Python 程序集成到 Nginx 中,并为我们提供很多的高级配置。在本篇文章中,我们将介绍…

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