1. 程式人生 > 實用技巧 >全網最全的http面試答案

全網最全的http面試答案

python 自帶的加密方法 以及使用

  • 1、這種加密方式的原理:加密時混入一段“隨機”字串(鹽值)再進行雜湊加密。即使
    密碼相同,如果鹽值不同,那麼雜湊值也是不一樣的。現在網站開發中主要是運
    用這種加密方法。

  • 這個模組主要是用到了兩個函式:

    • 密碼生成函式:generate_password_hash;
    • 密碼驗證函式:check_password_hash;
  • 密碼生成函式:generate_password_hash
    (1)函式定義

    werkzeug.security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8)
    1
    

    引數說明:

    • password: 明文密碼;
    • method:雜湊加密的方法(需要hashlib庫支援的),格式為pdpdf2:[:iterations];
      method:雜湊的方式,一般為SHA1;
      iterations:(可選引數)迭代次數,預設為1000;

    -slat_length: 鹽值的長度,預設為8。

  • 、碼驗證函式:check_password_hash
    (1)函式定義

    werkzeug.security.check_password_hash(pwhash, password)
    1
    

    引數說明:

    • pwhash:generate_password_hash生成的雜湊字串(即加密後的密碼);
    • password:需要驗證的明文密碼;

    check_password_hash函式用於驗證經過generate_password_hash雜湊的密碼,若密碼匹配,則返回真,否則返回假。

models

#導包  generate_password_hash 加密  check_password_hash解密
from werkzeug.security import generate_password_hash, check_password_hash
class User(BaseModel, db.Model):
    """使用者"""

    __tablename__ = "ih_user_profile"

    id = db.Column(db.Integer, primary_key=True)  # 使用者編號
    name = db.Column(db.String(32), unique=True, nullable=False)  # 使用者暱稱
    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密碼
    mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手機號
    real_name = db.Column(db.String(32))  # 真實姓名
    id_card = db.Column(db.String(20))  # 身份證號
    avatar_url = db.Column(db.String(128))  # 使用者頭像路徑
    houses = db.relationship("House", backref="user")  # 使用者釋出的房屋
    orders = db.relationship("Order", backref="user")  # 使用者下的訂單

    # 加上property裝飾器後,會把函式變為屬性,屬性名即為函式名
    @property
    def password(self):
        """讀取屬性的函式行為"""
        # print(user.password)  # 讀取屬性時被呼叫
        # 函式的返回值會作為屬性值
        # return "xxxx"
        raise AttributeError("這個屬性只能設定,不能讀取")

    # 使用這個裝飾器, 對應設定屬性操作
    @password.setter
    def password(self, value):
        """
        設定屬性  user.passord = "xxxxx"
        :param value: 設定屬性時的資料 value就是"xxxxx", 原始的明文密碼
        :return:
        """
        self.password_hash = generate_password_hash(value)

    # def generate_password_hash(self, origin_password):
    #     """對密碼進行加密"""
    #     self.password_hash = generate_password_hash(origin_password)

    def check_password(self, passwd):
        """
        檢驗密碼的正確性
        :param passwd:  使用者登入時填寫的原始密碼
        :return: 如果正確,返回True, 否則返回False
        """
        return check_password_hash(self.password_hash, passwd)