Flask開發中的用戶密碼加密
雖然MD5加鹽加密挺流行的,但是據說hash加鹽加密是無法破解的。
那么我們就看看flask當中是這么使用哈希加密和驗證的。
主要使用werkzeug的generate_password_hash,check_password_hash
例子一:
from werkzeug.security import generate_password_hash,check_password_hash for i in range(5): print(generate_password_hash('hello'))
結果大概是這樣的:
pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670 pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1 pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0 pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7 pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044
5次加密結果不一樣,
例子二:
from werkzeug.security import generate_password_hash, check_password_hash pass_hash = [ 'pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670', 'pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1', 'pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0', 'pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7', 'pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044' ] for i in pass_hash: print(i) print('密碼校驗結果:%s', check_password_hash(i, 'hello'))
結果大概是這樣:
hash密碼串: pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670
密碼校驗結果: True
hash密碼串: pbkdf2:sha256:150000$rEUFsDtH$e63823ba2f90af4116ed8ff73a0ccedc0256a061aa2a8cabc43de5a78281f8e1
密碼校驗結果: True
hash密碼串: pbkdf2:sha256:150000$EyGbxmTY$fe19de43d9f3a20db0275a6509d412a499adfe1f3395bf576cd00f6d0601e5d0
密碼校驗結果: True
hash密碼串: pbkdf2:sha256:150000$0xoXdJPX$cbd9d9ce9afb7ab59adaa72fafed93b546fa6eabe5fd435047b96e229081eec7
密碼校驗結果: True
hash密碼串: pbkdf2:sha256:150000$611ZQpcE$18bcac13bebcc961a9424ca7b4a2457eb4ad44fd339025f4b9e2a0fbb36f5044
密碼校驗結果: True
反正驗證是通過了。加密解密校驗步驟就不用操心了。
例子三:
當然,為了在flask當中使用更方便,數據庫定義還是改一下吧,具體如下:
# !/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2020/1/15 14:09 # @Author : Jackadam # @Email : # @File : model.py # @Software: PyCharm from sqlalchemy import Column, String, Integer from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from werkzeug.security import generate_password_hash, check_password_hash db_url = 'sqlite:///test.db' engine = create_engine(db_url, encoding='utf-8') Base = declarative_base() # 生成orm基類 Session_class = sessionmaker(bind=engine) # 創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 db_session = Session_class() # 生成session實例 class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(32)) _password_hash_ = Column(String(256)) # 加下划線作為私有函數,無法被外部訪問。 @property def password(self): raise Exception('密碼不能被讀取') #為了保持使用習慣,還是設置一個password字段用來設置密碼,當然也不能被讀取。 # 賦值password,則自動加密存儲。 @password.setter def password(self, value): self._password_hash_ = generate_password_hash(value) # 使用check_password,進行密碼校驗,返回True False。 def check_password(self, pasword): return check_password_hash(self._password_hash_, pasword) Base.metadata.create_all(engine) # 新增用戶 new = Users(username='jack', password='123') db_session.add(new) db_session.commit() # 查詢用戶 tag = db_session.query(Users).filter_by(username='jack').first() print(tag.check_password('123'))
在flask當中,多幾個表單處理就好了。