zoukankan      html  css  js  c++  java
  • 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.py
    user = 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中加盐哈希加密的具体操作。

  • 相关阅读:
    《C++标准程序库》 第6章 STL Container
    《C++语言99个常见编程错误》
    单例模式
    《C++标准程序库》 第7章 Iterator Adapters
    Shell颜色封装(C++)
    《改善C++程序的150个建议》
    OpenCV之图片的创建、保存和复制
    XMLDOM对象方法:对象事件
    三国中最精辟的十句话
    中国十大名茶及鉴别方法
  • 原文地址:https://www.cnblogs.com/two-peanuts/p/11143575.html
Copyright © 2011-2022 走看看