Flask成长笔记--在Flask中加密的方式

参考博客:https://segmentfault.com/a/1190000002393218
一、利用python自带的hashlib库实现加密
1、SHA1加密

python中的用法:

>>> import hashlib
>>> data = '123456'
>>> temp = hashlib.sha1(data)
>>> temp.hexdigest()
'7c4a8d09ca3762af61e59520943dc26494f8941b'

    1
    2
    3
    4
    5
    6

flask中的用法:

import hashlib

# 注册网页
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET': # 浏览器访问
        return render_template('main/ssb_login.html')
    if request.method == 'POST': # form提交处理逻辑
        username = request.form['username']
        pwd_temp = hashlib.sha1(request.form['password'])# sha1哈希加密
        password = pwd_temp.hexdigest()# sha1哈希加密
        checkcode = request.form['checkcode']
        if isNameExist(username): # 用户名已经存在
            return 'nameisexisted'
        elif not isCheckCode(checkcode): # 验证码不正确
            return 'checkcodeerror'
        else:
            setNewAdmin(username, password,checkcode)
            return 'success'

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

2、MD5加密

Python中用法:

>>> import hashlib
>>> data = '123456'
>>> temp = hashlib.md5(data)
>>> temp.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

    1
    2
    3
    4
    5

flask中的用法:

import hashlib

# 注册网页
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET': # 浏览器访问
        return render_template('main/ssb_login.html')
    if request.method == 'POST': # form提交处理逻辑
        username = request.form['username']
        pwd_temp = hashlib.md5(request.form['password'])# MD5加密
        password = pwd_temp.hexdigest()# MD5加密
        checkcode = request.form['checkcode']
        if isNameExist(username): # 用户名已经存在
            return 'nameisexisted'
        elif not isCheckCode(checkcode): # 验证码不正确
            return 'checkcodeerror'
        else:
            setNewAdmin(username, password,checkcode)
            return 'success'

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

二、利用Flask中的werkzeug.security模块加密

 这个模块中主要是利用到两个函数:

    (1)密码生成函数:generate_password_hash
    (2)密码验证函数:check_password_hash

1、密码生成函数:generate_password_hash

函数定义:

werkzeug.security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8)

    1

参数说明:

    password:明文密码
    method:哈希加密的方法(需要hashlib库支持的),格式为pdpdf2:<method>[:iterations]
        method:哈希的方式,一般为SHA1
        iterations:(可选参数)迭代次数,默认为1000
    salt_length:盐值的长度,默认为8

加密之后的字符串格式:

method$salt$hash

    1
    2

2、密码验证函数:check_password_hash

函数定义:

werkzeug.security.check_password_hash(pwhash, password)

    1

参数定义:

    pwhash:generate_password_hash生成的哈希字符串
    password:需要验证的明文密码

 check_password_hash函数用于验证经过generate_password_hash哈希的密码
。若密码匹配,则返回真,否则返回假。
用法:

OOP用法:

from werkzeug.security import generate_password_hash,check_password_hash

class User(object):

    def __init__(self, username, password):
        self.username = username
        self.set_password(password)

    def set_password(self, password):
        self.pw_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.pw_hash, password)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

>>> me = User('John Doe', 'default')
>>> me.pw_hash
'sha1$Z9wtkQam$7e6e814998ab3de2b63401a58063c79d92865d79'
>>> me.check_password('default')
True
>>> me.check_password('defaultx')
False

    1
    2
    3
    4
    5
    6
    7

通常用法:

#哈希加盐的密码加密方法
def enPassWord(password):#将明密码转化为hash码
    return generate_password_hash(password)#返回转换的hash码

def checkPassWord(enpassword,password):#第一参数是从数据查询出来的hash值,第二参数是需要检验的密码
    return check_password_hash(enpassword,password)#如果匹配返回true

    1
    2
    3
    4
    5
    6

#注册新用户
@main.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template("user/register.html")
    if request.method == 'POST':
        u = request.form['username']
        p = enPassWord(request.form['password'])
        email = request.form['email']
        addUser(u,p,email)
        return redirect('/signin')#注册完之后进入登录页面

#登录用户
@main.route('/signin', methods=['GET', 'POST'])
def signin():
    if request.method == 'GET':
        return render_template("user/login.html")
    if request.method == 'POST':
        u = request.form['username']
        p = request.form['password']
        if isNameExisted(u):
            t = checkPassword(u);#获得数据库存储的hash值
            if check_password_hash(t,p):#查询有没有这个用户
                session['logged_in'] = True
                return redirect('/user/blog')
        else:#没有用户就是新用户那么就转入注册页面
            return redirect('/register')
--------------------- 
作者:liefyuan 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_28877125/article/details/76176883 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值