天天看點

13flask密碼加密

一,了解密碼加密方式

  密碼具有私有性較強的特性,預測密碼加密對個人隐私的保護有這非常大的作用。在用flask搭建網站時候若伺服器有被攻破的風險,要是使用者表中密碼字段也被拿走,後果将不堪設想。

  在密碼保護中主要有密碼加密和密碼存儲兩種方式:

  1,密碼加密

  主要是在密碼本身加密過程中的處理政策。

  • 明文轉碼加密:BASE64, 7BIT等。BASE64隻是利用索引對應關系進行加密的方式,具有可逆性,在安全性上隻比明文的安全性高一點點,這種方式并不能算做真正的加密。
  • 對稱算法加密:DES, RSA等。DES是将後半部分與前半部分進行置換的政策。3DES是DES的三重加密,安全性比較高,位數也比較長,目前沒有3DES被破解的記錄。
  • 簽名算法加密:如MD5, SHA1等。

       MD5(Message-Digest Algorithm 5),也叫資訊-摘要算法,他的特點是加密算法比較固定,如果兩個密碼明文部分相同,則得到的哈希值是一樣的,有被破解的風險。

  • 加鹽哈希加密:最大特點是的“撒鹽”操作,加密時“随機”字元串(鹽值),再進行哈希加密。即使輸入的密碼相同,若鹽值不同,那麼哈希值也不一樣。

  eg:我将使用者“zy”和“zy1”的密碼都設定為“111”,通過撒鹽哈希加密後得到:

 

13flask密碼加密

  明文部分一樣,但是用撒鹽方式後得到不用的密碼,具有唯一性。現在網站開發中主要是運用這種加密方法。

  2密碼存儲的主要形式:

  主要是在密碼本身存儲過程中的處理政策。

  • 明文存儲:沒有任何安全性,一旦資料庫被黑所有密碼直接明文顯示在黑客面前。
  • 加密存儲:通過一定的變換形式,使得密碼原文不易被識别。

二,認識werkzeug

  暫時了解一下Web Server Gateway Interface(WSGI),Web應用的實質是用戶端想伺服器發送HTTP請求,伺服器根據請求傳回HTTP響應,用戶端接受的響應會在用戶端顯示出來。在學習Web應用前,首先得搞懂HTTP的相關知識,以及TCP,UDP的使用,在Web開發中增加了底層開發,使得開發具有一定難度。

  這時,WSGI作為在Web應用及底層TCP之間的接口,直接對WSGI操作,再通過WSGI去操作底層TCP應用,免去了底層開發的麻煩。

  werkzeug是Python中WSGI規範的實用函數庫,是以,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中加鹽哈希加密的具體操作。

轉載于:https://www.cnblogs.com/two-peanuts/p/11143575.html