一,了解密碼加密方式
密碼具有私有性較強的特性,預測密碼加密對個人隐私的保護有這非常大的作用。在用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是Python中WSGI規範的實用函數庫,是以,Web開發中werkzeug的重要性不言而喻,他具有如下功能:
- HTTP頭解析與封裝
- 易于使用的request和 response對象
- 基于浏覽器的互動式 JavaScript調試器
- 與 WSGI 1.0 規範100%相容
- 支援Python 2.6,Python 2.7和Python3.3
- 支援 Unicode
- 支援基本的 會話管理及簽名 Cookie
- 支援URI和IRI的Unicode使用工具
- 内置支援相容各種浏覽器和 WSGI伺服器的實用工具
- 內建 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