Flask開發中的用戶密碼加密


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當中,多幾個表單處理就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM