如何在 Python 中隱藏和加密密碼?


簡介

在當前的數字時代,安全至關重要。在我們作為開發人員的工作中,我們經常處理機密資料,例如密碼。為了保護這些敏感資料,使用正確的密碼加密和隱藏方法至關重要。Python 中有許多可用的技術和模組可以幫助我們實現此目標。本文探討了在 Python 中隱藏和加密密碼的最佳實踐和方法,並解釋了基本概念和可用的實現示例。

密碼安全的重要性

密碼充當保護使用者帳戶和敏感資訊的第一道防線。但是,以明文形式儲存密碼可能會嚴重危及您的安全性。如果攻擊者能夠訪問應用程式的資料庫或檔案,則可以輕鬆檢索密碼並被惡意使用。因此,採用限制密碼洩露並使攻擊者更難以讀取密碼的策略至關重要。

隱藏密碼:使用 getpass 模組

保護密碼的第一步是防止使用者輸入密碼時將其顯示在螢幕上。Python 中的 getpass 模組提供了一種簡單有效的方法來實現這一點。透過使用 getpass 函式,我們可以提示使用者輸入密碼,而不會在終端上回顯輸入。這確保了密碼不會被他人看到。

密碼雜湊:單向加密

密碼安全通常是透過雜湊實現的。它涉及使用雜湊演算法將密碼轉換為固定長度的字串。從生成的雜湊中反向工程原始密碼非常困難,因為生成的雜湊對於密碼是唯一的。Python 透過 hashlib 模組提供了多種雜湊方法,包括 MD5、SHA-1 和 SHA-256。需要注意的是,由於存在漏洞,MD5 和 SHA-1 等舊的雜湊演算法不再被認為是安全的。建議使用更安全的演算法,如 SHA-256 或 bcrypt。

密碼加鹽:在雜湊中新增隨機性

僅使用雜湊可能不足以防止彩虹表或暴力破解等攻擊。為了進一步增強安全性,我們可以引入一種稱為加鹽的技術。鹽是在雜湊之前附加到密碼的隨機值。此隨機值即使原始密碼相同,也會為每個密碼雜湊新增唯一性。透過使用鹽,我們可以降低雜湊衝突的風險,並顯著提高破解雜湊密碼的難度。

使用金鑰派生函式:加強密碼雜湊

金鑰派生函式 (KDF) 提供了一種更安全的方法來雜湊密碼。這些函式(例如 bcrypt 和 PBKDF2)包含額外的安全措施,例如多次迭代和可自定義的工作因子。透過增加生成密碼雜湊的計算成本,KDF 會減慢破解過程,並使攻擊者更難以獲取資源。特別是 bcrypt 演算法因其自適應雜湊函式和對暴力破解攻擊的抵抗力而受到高度推薦。

安全儲存密碼:資料庫注意事項

對於大多數應用程式,密碼通常需要永久儲存在資料庫中。在儲存密碼時,使用安全程式以防止未經授權的訪問至關重要。一些最佳實踐包括使用強大的資料庫憑據、加密密碼雜湊以及限制對資料庫的訪問。儘可能使用引數化查詢和 ORM(物件關係對映)庫,以及具有內建安全措施的資料庫框架。

保護傳輸中的密碼:HTTPS 和 SSL/TLS

密碼在網路上傳輸時容易受到攻擊。為了在客戶端和伺服器之間通訊期間保護密碼,使用 HTTPS 和 SSL/TLS 等安全協議至關重要。這些協議對客戶端和伺服器之間交換的資料進行加密,確保敏感資訊(包括密碼)的機密性和完整性。透過在伺服器端實施 SSL/TLS 證書並配置安全的通訊通道,我們可以防止密碼被攔截和未經授權的訪問。

密碼加密:雙向加密

有時需要以一種允許我們稍後解密並獲取原始密碼的方式加密密碼。此類情況需要雙向加密,有時稱為對稱加密。Python 透過其 cryptography 包提供了多種加密技術,包括 DES 和 AES(高階加密標準)。我們可以使用金鑰加密密碼,並安全地儲存和恢復密碼。

防止常見攻擊

除了實施密碼隱藏和加密技術外,瞭解常見的與密碼相關的攻擊並採取必要的預防措施也很重要。這包括防禦暴力破解攻擊、實施密碼複雜性要求、實施帳戶鎖定策略以及教育使用者瞭解密碼安全最佳實踐。

Python 實現

示例

import getpass 
import hashlib 
from cryptography.fernet import Fernet 
 
# Password Hiding: Hiding password during input password = getpass.getpass("Enter your password: ") 
 
# Password Hashing: Hashing password using SHA-256 hashed_password = hashlib.sha256(password.encode()).hexdigest() 
print("Hashed Password:", hashed_password) 
 
# Password Salting: Adding salt to the password before hashing salt = "somesalt" salted_password = hashlib.sha256((password + salt).encode()).hexdigest() 
print("Salted Password:", salted_password) 
 
# Password Encryption: Encrypting and decrypting password using Fernet symmetric encryption key = Fernet.generate_key() cipher_suite = Fernet(key) 
 
# Encrypting password encrypted_password = cipher_suite.encrypt(password.encode()).decode() 
print("Encrypted Password:", encrypted_password) 
 
# Decrypting password decrypted_password = cipher_suite.decrypt(encrypted_password.encode()).decode() 
print("Decrypted Password:", decrypted_password) 

輸出

Input is abc 
 
Enter your password: ·········· 
Hashed 	Password: 
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 
Salted 	Password: 
62db247862626a3a8587e652ed5c37e0fe0738ebadf125acbc2e839caa63f330 
Encrypted Password: gAAAAABkb6xcfvsOZxb3PTfyJlTtmpOYx7T4XpF6WyhSIYwnXrs-UzIuuHd0xMlzj8ZV2wRy5Lg50UFipiX-na0cKgzHBbUTg== 
Decrypted Password: abc 

密碼隱藏

使用 getpass.getpass() 方法在輸入期間隱藏密碼。使用者輸入密碼時,密碼不會顯示在螢幕上。這可以防止窺探和隱藏密碼不被他人看到。

密碼雜湊

使用 hashlib.sha256() 方法計算密碼的 SHA-256 雜湊。雜湊是一個單向過程,它將密碼轉換為固定長度的字串。在此示例中,使用 SHA-256 演算法生成一個 256 位的雜湊值。由於其安全性級別和無需儲存實際密碼即可執行密碼驗證的能力,雜湊是儲存密碼的常用方法。

密碼加鹽

為了增強雜湊密碼的安全性,在雜湊之前會新增鹽。鹽是附加到密碼上的額外隨機值,然後進行雜湊。這可以防止使用預先計算的表(彩虹表)來破解密碼。在此示例中,透過在計算 SHA-256 雜湊之前將其與密碼連線來新增鹽。

密碼加密

使用 cryptography.fernet 模組對密碼進行對稱加密。在對稱加密技術中,加密和解密都需要相同的金鑰。在此示例中,使用 Fernet.generate_key() 生成一個隨機金鑰。然後使用該金鑰使用模組的 Fernet 類構建一個密碼套件。使用 cipher_suite.encrypt() 和 cipher_suite.decrypt() 分別加密和解密密碼。

結論

保護密碼是應用程式安全的重要方面。透過在 Python 中實施有效的密碼隱藏和加密技術,我們可以顯著增強應用程式的安全性並保護使用者憑據。從隱藏輸入期間的密碼到雜湊、加鹽和使用安全的加密演算法,有多種方法可用於保護密碼。瞭解每種技術的優缺點並根據應用程式的具體要求適當地應用它們至關重要。透過優先考慮密碼安全並遵循最佳實踐,我們可以降低未經授權訪問的風險,並確保敏感使用者資訊的隱私和完整性。

更新於: 2023年7月24日

3K+ 閱讀量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告