13flask密码加密
一,了解密碼加密方式
密碼具有私有性較強(qiáng)的特性,預(yù)測(cè)密碼加密對(duì)個(gè)人隱私的保護(hù)有這非常大的作用。在用flask搭建網(wǎng)站時(shí)候若服務(wù)器有被攻破的風(fēng)險(xiǎn),要是用戶表中密碼字段也被拿走,后果將不堪設(shè)想。
在密碼保護(hù)中主要有密碼加密和密碼存儲(chǔ)兩種方式:
1,密碼加密
主要是在密碼本身加密過(guò)程中的處理策略。
明文轉(zhuǎn)碼加密:BASE64, 7BIT等。BASE64只是利用索引對(duì)應(yīng)關(guān)系進(jìn)行加密的方式,具有可逆性,在安全性上只比明文的安全性高一點(diǎn)點(diǎn),這種方式并不能算做真正的加密。
對(duì)稱算法加密:DES, RSA等。DES是將后半部分與前半部分進(jìn)行置換的策略。3DES是DES的三重加密,安全性比較高,位數(shù)也比較長(zhǎng),目前沒(méi)有3DES被破解的記錄。
簽名算法加密:如MD5, SHA1等。
MD5(Message-Digest Algorithm 5),也叫信息-摘要算法,他的特點(diǎn)是加密算法比較固定,如果兩個(gè)密碼明文部分相同,則得到的哈希值是一樣的,有被破解的風(fēng)險(xiǎn)。
加鹽哈希加密:最大特點(diǎn)是的“撒鹽”操作,加密時(shí)“隨機(jī)”字符串(鹽值),再進(jìn)行哈希加密。即使輸入的密碼相同,若鹽值不同,那么哈希值也不一樣。
eg:我將用戶“zy”和“zy1”的密碼都設(shè)置為“111”,通過(guò)撒鹽哈希加密后得到:
明文部分一樣,但是用撒鹽方式后得到不用的密碼,具有唯一性。現(xiàn)在網(wǎng)站開(kāi)發(fā)中主要是運(yùn)用這種加密方法。
2密碼存儲(chǔ)的主要形式:
主要是在密碼本身存儲(chǔ)過(guò)程中的處理策略。
明文存儲(chǔ):沒(méi)有任何安全性,一旦數(shù)據(jù)庫(kù)被黑所有密碼直接明文顯示在黑客面前。
加密存儲(chǔ):通過(guò)一定的變換形式,使得密碼原文不易被識(shí)別。
二,認(rèn)識(shí)werkzeug
暫時(shí)了解一下Web Server Gateway Interface(WSGI),Web應(yīng)用的實(shí)質(zhì)是客戶端想服務(wù)器發(fā)送HTTP請(qǐng)求,服務(wù)器根據(jù)請(qǐng)求返回HTTP響應(yīng),客戶端接受的響應(yīng)會(huì)在客戶端顯示出來(lái)。在學(xué)習(xí)Web應(yīng)用前,首先得搞懂HTTP的相關(guān)知識(shí),以及TCP,UDP的使用,在Web開(kāi)發(fā)中增加了底層開(kāi)發(fā),使得開(kāi)發(fā)具有一定難度。
這時(shí),WSGI作為在Web應(yīng)用及底層TCP之間的接口,直接對(duì)WSGI操作,再通過(guò)WSGI去操作底層TCP應(yīng)用,免去了底層開(kāi)發(fā)的麻煩。
werkzeug是Python中WSGI規(guī)范的實(shí)用函數(shù)庫(kù),因此,Web開(kāi)發(fā)中werkzeug的重要性不言而喻,他具有如下功能:
HTTP頭解析與封裝
易于使用的request和response對(duì)象
基于瀏覽器的交互式JavaScript調(diào)試器
與 WSGI 1.0 規(guī)范100%兼容
支持Python 2.6,Python 2.7和Python3.3
支持Unicode
支持基本的會(huì)話管理及簽名Cookie
支持URI和IRI的Unicode使用工具
內(nèi)置支持兼容各種瀏覽器和WSGI服務(wù)器的實(shí)用工具
集成URL請(qǐng)求路由系統(tǒng)
三,在flask中的密碼加密
在flask中的加密方式是加鹽哈希加密,我們?cè)趂lask項(xiàng)目的model中調(diào)用加鹽哈希即可將密碼加密。具體操作:
1,在用戶表中定義好各類字段,其中包括密碼字段,初始化數(shù)據(jù)庫(kù)時(shí)將密碼加密。
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
這樣在注冊(cè)過(guò)程中的密碼就進(jìn)行了加密。
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
#在登陸時(shí)候的驗(yàn)證操作
def check_hash_password(self,raw_password): #這里的參數(shù)是hash過(guò)的參數(shù)以及原始傳入hash
password = check_password_hash(self.password,raw_password)
return password #得到驗(yàn)證的密碼
在登陸中的操作:
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中加鹽哈希加密的具體操作。
總結(jié)
以上是生活随笔為你收集整理的13flask密码加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于《金字塔原理》的主要内容
- 下一篇: PS文件和AI文件之间如何保持分层相互导