13flask密码加密

一,了解密码加密方式

  密码具有私有性较强的特性,预测密码加密对个人隐私的保护有这非常大的作用。在用flask搭建网站时候若服务器有被攻破的风险,要是用户表中密码字段也被拿走,后果将不堪设想。

  在密码保护中主要有密码加密和密码存储两种方式:

  1,密码加密

  主要是在密码本身加密过程中的处理策略。

  • 明文转码加密:BASE64, 7BIT等。BASE64只是利用索引对应关系进行加密的方式,具有可逆性,在安全性上只比明文的安全性高一点点,这种方式并不能算做真正的加密。
  • 对称算法加密:DES, RSA等。DES是将后半部分与前半部分进行置换的策略。3DES是DES的三重加密,安全性比较高,位数也比较长,目前没有3DES被破解的记录。
  • 签名算法加密:如MD5, SHA1等。

 MD5(Message-Digest Algorithm 5),也叫信息-摘要算法,他的特点是加密算法比较固定,如果两个密码明文部分相同,则得到的哈希值是一样的,有被破解的风险。

  • 加盐哈希加密:最大特点是的“撒盐”操作,加密时“随机”字符串(盐值),再进行哈希加密。即使输入的密码相同,若盐值不同,那么哈希值也不一样。

  eg:我将用户“zy”和“zy1”的密码都设置为“111”,通过撒盐哈希加密后得到:

 

  明文部分一样,但是用撒盐方式后得到不用的密码,具有唯一性。现在网站开发中主要是运用这种加密方法。

  2密码存储的主要形式:

  主要是在密码本身存储过程中的处理策略。

  • 明文存储:没有任何安全性,一旦数据库被黑所有密码直接明文显示在黑客面前。
  • 加密存储:通过一定的变换形式,使得密码原文不易被识别。

二,认识werkzeug

  暂时了解一下Web Server Gateway Interface(WSGI),Web应用的实质是客户端想服务器发送HTTP请求,服务器根据请求返回HTTP响应,客户端接受的响应会在客户端显示出来。在学习Web应用前,首先得搞懂HTTP的相关知识,以及TCP,UDP的使用,在Web开发中增加了底层开发,使得开发具有一定难度。

  这时,WSGI作为在Web应用及底层TCP之间的接口,直接对WSGI操作,再通过WSGI去操作底层TCP应用,免去了底层开发的麻烦。

  werkzeug是PythonWSGI规范的实用函数库,因此,Web开发中werkzeug的重要性不言而喻,他具有如下功能:

  1. HTTP头解析与封装
  2. 易于使用的request和response对象
  3. 基于浏览器的交互式JavaScript调试器
  4. 与 WSGI 1.0 规范100%兼容
  5. 支持Python 2.6,Python 2.7和Python3.3
  6. 支持Unicode
  7. 支持基本的会话管理及签名Cookie
  8. 支持URI和IRI的Unicode使用工具
  9. 内置支持兼容各种浏览器和WSGI服务器的实用工具
  10. 集成URL请求路由系统

三,在flask中的密码加密

  在flask中的加密方式是加盐哈希加密,我们在flask项目的model中调用加盐哈希即可将密码加密。具体操作:

  1,在用户表中定义好各类字段,其中包括密码字段,初始化数据库时将密码加密。

  

 1 class User(db.Model):
 2     __tablename__ = "user"
 3     id = db.Column(db.Integer,primary_key=True,autoincrement=True)
 4     username = db.Column(db.String(50),nullable=False)
 5     password = db.Column(db.String(100),nullable=False)
 6
 7     def __init__(self,*args,**kwargs):
 8         username = kwargs.get(‘username‘)
 9         password = kwargs.get(‘password‘)
10
11         self.username=username
12         self.password = generate_password_hash(password)
13  

  这样在注册过程中的密码就进行了加密。

  2,登陆

  

1 user = User.query.filter(User.id== id).first()
2         if user and user.check_hash_password(password):
3             session["user_id"] = user.id
4             session.permanent = True
5             return redirect(url_for(‘index‘))   

  3,具体代码:

  

model.py 
from werkzeug.security import generate_password_hash,check_password_hash

class User(db.Model):#定义表    __tablename__ = "user"    id = db.Column(db.Integer,primary_key=True,autoincrement=True)    telephone = db.Column(db.String(11),nullable=False)    username = db.Column(db.String(50),nullable=False)    password = db.Column(db.String(100),nullable=False)    job = db.Column(db.String(100),nullable=False)    city=db.Column(db.String(100),nullable=False)    introduce = db.Column(db.String(100),nullable=False)

#获取这些字段    def __init__(self,*args,**kwargs):        telephone = kwargs.get(‘telephone‘)        username = kwargs.get(‘username‘)        password = kwargs.get(‘password‘)        job = kwargs.get(‘job‘)        city = kwargs.get(‘city‘)        introduce = kwargs.get(‘introduce‘)#加密操作        self.telephone=telephone        self.username=username        self.password = generate_password_hash(password)        self.job = job        self.city = city        self.introduce = introduce#在登陆时候的验证操作    def check_hash_password(self,raw_password):  #这里的参数是hash过的参数以及原始传入hash        password = check_password_hash(self.password,raw_password)        return password  #得到验证的密码  

  在登陆中的操作:

app.pyuser = User.query.filter(User.telephone == telephone).first()
        if user and user.check_hash_password(password):
            session["user_id"] = user.id
            session.permanent = Truereturn redirect(url_for(‘index‘))   

  以上为flask中加盐哈希加密的具体操作。

原文地址:https://www.cnblogs.com/two-peanuts/p/11143575.html

时间: 2024-09-30 21:18:29

13flask密码加密的相关文章

extmail 密码加密方式修改为plain-md5的方法

extmail默认密码加密方式是md5crypt,但是有些时候会遇到这样的问题--老的邮件系统中的用户密码是md5加密的. 此时需要将extmail的密码加密方式修改为md5,通过官方解释(md5和md5crypt没有区别),修改为plain-md5即可.但是,这只解决了web登陆的验证问题,没有解决smtp以及pop3的验证问题. 通过 http://www.extmail.org/forum/viewthread.php?tid=3175 帖子解决了验证问题,内容摘录如下: courier-

用户密码加密存储十问十答,一文说透密码安全存储

我们数据库的权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储不行吗? 不行.存储在数据库的数据面临很多威胁,有应用程序层面.数据库层面的.操作系统层面的.机房层面的.员工层面的,想做到百分百不被黑客窃取,非常困难. 如果密码是加密之后再存储,那么即便被拖库,黑客也难以获取用户的明文密码.可以说,密码加密存储是用户账户系统的底裤,它的重要性,相当于你独自出远门时缝在内衣里钱,虽然你用到他们的概率不大,但关键时刻他们能救命. 那用加密算法比如AES,把密码加密下再存,需要明文的时候我再解密

SQLSERVER使用密码加密备份文件以防止未经授权还原数据库

原文:SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 在备份数据库的时候,用户可以为媒体集.备份集或两者指定密码 在backup语句中,定义备份集密码和媒体密码为可选功能.使用密码可防止利用SQLSERVER工具未经授权地执行还原操作和在媒体中添加备份集. 如果指定了密码则用户还必须提供媒体密码才能执行这些操作 关于媒体集和备份集大家可以参考MSDN:http://msdn.microsoft.com/zh-cn/l

C#:使用MD5对用户密码加密与解密

C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 /// <summary> /// 16位MD5加密 /// </summary> /// <param name="password"></param> /// <returns></returns&

seci-log 1.10 发布 增加了全文搜索集成密码加密等多个功能点

日志分析软件增加了多个功能点 1.修改了windows2003 扫描资产的错误. 2.增加了密码加密功能,对邮件,远程机器访问的秘密进行加密,会更安全一些. 3.增加了资产统计报表 4.完善了整体报告,增加了告警主机排行和告警类型排行. 5.增加了登录统计报表 6.整合了全文搜索.这样就可以去掉了Kibana,虽然我们的功能还是有点弱,但是查询没有问题了.具体看下图,搜索192.168.0.104 loginin su就会像百度一下吧相关日志搜索出来. 欢迎大家使用

Java密码加密与解密

Java密码加密与解密 Java中对代码进行加密与解密,其中用MD5方式的是不可逆的.   import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import

(三)学习MVC之密码加密及用户登录

1.密码加密采用SHA256 算法,此类的唯一实现是 SHA256Managed.在Common/Text.cs里添加Sha256方法: public static string Sha256(string plainText) { SHA256Managed _sha256 = new SHA256Managed(); byte[] _cipherText = _sha256.ComputeHash(Encoding.Default.GetBytes(plainText)); return C

Python Show-Me-the-Code 第 0021题 密码加密

第 0021 题: 通常,登陆某个网站或者 APP,需要使用用户名和密码.密码是如何加密后存储起来的呢?请使用 Python 对密码加密. 阅读资料 用户密码的存储与 Python 示例 阅读资料 Hashing Strings with Python 阅读资料 Python's safest method to store and retrieve passwords from a database 思路: 加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又

C#三层架构(获取中文拼音和给密码加密)

在学习三层架构时,我们在需要获取中文字所获取的拼音,需要引进一个ChnCharInfo.dll的程序文件,并且引用命名空间 using Microsoft.International.Converters.PinYinConverter; 接下来是如何实现拼音的获取: 1 public static string GetPinyins(string name) 2 { 3 //进行拼接字符串 4 StringBuilder sb = new StringBuilder(); 5 //由于Chin