密碼加密 md5 sha1 鹽值

2022-06-19 01:06:12 字數 2432 閱讀 7403

python的hashlib提供了常見的摘要演算法,如md5,sha1等等。

什麼是摘要演算法呢?摘要演算法又稱雜湊演算法、雜湊演算法。

hash,一般翻譯做"雜湊",也有直接音譯為"雜湊"的,就是把任意長度的輸入,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。

md5與sha1都是hash演算法,md5輸出是128位元組的,sha1輸出是160位元組的,md5比sha1快,sha1比md5強度高。

根據上述常見的加密演算法,測試人員在測試不同的加密介面可採用下述的方法處理加密介面

摘要演算法(md5.sha1 ):造介面資料前呼叫md5,sha1進行編碼,服務端對比編碼後的字串是否一致

對稱加密演算法(aes,des ):造介面資料前從開發獲取對稱公鑰,基於對稱公鑰可以加密請求資料,解密響應報文

非對稱加密演算法(rsa):造介面資料前從開發獲取公鑰私鑰去加密解密介面資料

使用者認證:一般的介面測試工具都會提供乙個user auth/authorization的選項

密碼不加密的話,開啟開發者模式(f12)就可以輕易看到密碼。

登入**的使用者名稱密碼資料庫是不會以明文密碼進行儲存的,如果以明文儲存使用者口令,如果資料庫洩露,所有使用者的口令就落入黑客的手裡。此外,**運維人員是可以訪問資料庫的,也就是能獲取到所有使用者的口令。

正確的儲存口令的方式是不儲存使用者的明文口令,而是儲存使用者口令的摘要當使用者登入時,首先計算使用者輸入的明文口令的md5,然後和資料庫儲存的md5對比,如果一致,說明口令輸入正確,如果不一致,口令肯定錯誤。

'e10adc3949ba59abbe56e057f20f883e': '123456'

'21218cca77804d2ba1922c33e0151105': '888888'

'5f4dcc3b5aa765d61d8327deb882cf99': 'password'

這樣,無需破解,只需要對比資料庫的md5,黑客就獲得了使用常用口令的使用者賬號。

對於使用者來講,當然不要使用過於簡單的口令。但是,我們能否在程式設計上對簡單口令加強保護呢?

由於常用口令的md5值很容易被計算出來,所以,要確保儲存的使用者口令不是那些已經被計算出來的常用口令的md5,這一方法通過對原始口令加乙個複雜字串來實現,俗稱「加鹽」:

經過salt處理的md5口令,只要salt不被黑客知道,即使使用者輸入簡單口令,也很難通過md5反推明文口令。

但是如果有兩個使用者都使用了相同的簡單口令比如123456,在資料庫中,將儲存兩條相同的md5值,這說明這兩個使用者的口令是一樣的。有沒有辦法讓使用相同口令的使用者儲存不同的md5呢?如果假定使用者無法修改登入名,就可以通過把登入名作為salt的一部分來計算md5,從而實現相同口令的使用者也儲存不同的md5。

import hashlib #匯入hashlib模組

md5 = hashlib.md5() #獲取乙個md5加密演算法物件

md5.update('111111aa'.encode('utf-8')) #制定需要加密的字串

print(md5.hexdigest()) #獲取加密後的16進製制字串 

得到如下:e5ccc8270cd29ba187ddde8f864438ee

需要注意的是,字串後面要加個.encode(『utf-8』),因為hashlib是對二進位制進行加密的,如果直接對字串加密的話, 會報錯的。因此需要通過encode將字串轉碼成二進位制格式。

(補充:

print(md5.hexdigest())     十六進製制,輸出的是字母跟數字組合,使用者看的懂,所以會轉換成十六進製制的顯示密碼

print(md5.digest()) 二進位制

e5ccc8270cd29ba187ddde8f864438ee

b"\xe5\xcc\xc8'\x0c\xd2\x9b\xa1\x87\xdd\xde\x8f\x86d8\xee"

encode是編碼

decode是解碼)

sha1同理:

sha1 = hashlib.sha1()

# sign_str = "111111"

# sign_bytes_utf8 = sign_str.encode()

# sha1.update(sign_bytes_utf8)

# sign_sha1 = sha1.hexdigest()

# print(sign_sha1)

介面處理的時候,先把用例裡面的明文密碼進行加密處理(md5+鹽(登陸名+固定字元)/sha1+鹽(登陸名+固定字元)),得出密文,再拿這個密文跟資料庫裡的進行比對,是否一致。

所以做之前要先問下開發資料庫裡的密碼是怎麼加密的,來選擇相應的方法設計自動化

C 獲取檔案MD5 SHA1

計算檔案的 md5 值 要計算 md5 值的檔名和路徑 md5 值16進製制字串 public string md5file string filename 計算檔案的 sha1 值 要計算 sha1 值的檔名和路徑 sha1 值16進製制字串 public string sha1file stri...

Shiro密碼的MD5加密 MD5鹽值加密

用md5加密演算法後,前台使用者輸入的字串如何使用md5加密,需要做的是將當前的realm 的credentialsmatcher屬性,替換為md5credentialsmatcher 由於md5credentialsmatcher已經過期了,推薦使用hashedcredentialsmatcher...

鹽值加密 MD5

什麼叫鹽值加密 spring security怎樣進行鹽值加密 以前的md5原理是 密碼密文 md5演算法 密碼明文 這樣明文與密文其實還是一一對應的 那麼人家就可以用字典攻擊 就是乙個乙個的試 來探測密碼 加鹽 鹽值加密 的演算法很多 spring security用的是 密碼密文 md5演算法 ...