1. 程式人生 > >python hashlib密碼加密

python hashlib密碼加密

  1. hashlib.md5(data)函式中,data引數的型別應該是bytes。 hash前必須把資料轉換成bytes型別hash前必須把資料轉換成bytes型別
    from hashlib import md5
     c = md5("helloworld")
    # TypeError: Unicode-objects must be encoded before hashing
     c = md5("helloworld".encode("utf-8"))
    
  2. 函式說明
    • hashlib.md5(data)
    • digest() :返回加密後字串的16進製表示,其位數為digest_size
    • digest_size
  3. 程式例項
    import numpy as np
    import hashlib
    
    a = hashlib.md5("64".encode("utf-8"))
    print(a)
    print(a.digest())
    print(a.digest_size)
    print(a.digest()[-1])
    b = hashlib.md5("64".encode("utf-8"))
    print(a.digest() == b.digest())
    

程式輸出:

first output: <md5 HASH object @ 0x000001F196B02418> b’\xea]/\x1cF\x08#.\x07\xd3\xaa=\x99\x8eQ5’ 16 53 True

second output: <md5 HASH object @ 0x0000016759262418> b’\xea]/\x1cF\x08#.\x07\xd3\xaa=\x99\x8eQ5’ 16 53 True

注意:

  • 兩次執行程式輸出物件a雖然不同,但digest()輸出完全相同
  • a和b的digest()完全相同,
  1. 利用上述兩點可以做成簡單的密碼加密系統,增加密碼的安全性

         # table儲存著{nickname: md5_password},暱稱和密碼的md5的加密值
        # 檢查賬號
        def in_database(name, passw):
        	if
    hashlib.md5(passw.encode("utf-8")).digest() == table[name].digest(): print('賬戶在系統中') # 進入程式 else: print('賬號和密碼不一致')
  2. 此程式中利用此haslib庫來確定某一項是否要進入測試集中

    hash值的最後一下項小於256*test_ratio,則放入測試集中, date為pandas物件

    	import hashlib
    	def test_set_check(identifier, test_ratio, hash):
            return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio
    	def split_train_test_by_id(data, test_ratio, id_column, hash=hashlib.md5):
    		ids = data[id_column]
    		in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio, hash))
    		return data.loc[~in_test_set], data.loc[in_test_set]