Python 3.4'ten itibaren, hashlib
standart kitaplıktaki modül , "güvenli parola karması için tasarlanmış" anahtar türetme işlevlerini içerir .
Öyleyse bunlardan birini, örneğin hashlib.pbkdf2_hmac
, aşağıdakiler kullanılarak oluşturulan bir tuzla kullanın os.urandom
:
from typing import Tuple
import os
import hashlib
import hmac
def hash_new_password(password: str) -> Tuple[bytes, bytes]:
"""
Hash the provided password with a randomly-generated salt and return the
salt and hash to store in the database.
"""
salt = os.urandom(16)
pw_hash = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
return salt, pw_hash
def is_correct_password(salt: bytes, pw_hash: bytes, password: str) -> bool:
"""
Given a previously-stored salt and hash, and a password provided by a user
trying to log in, check whether the password is correct.
"""
return hmac.compare_digest(
pw_hash,
hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
)
salt, pw_hash = hash_new_password('correct horse battery staple')
assert is_correct_password(salt, pw_hash, 'correct horse battery staple')
assert not is_correct_password(salt, pw_hash, 'Tr0ub4dor&3')
assert not is_correct_password(salt, pw_hash, 'rosebud')
Bunu not et:
- 16 baytlık tuz ve 100000 PBKDF2 yinelemesinin kullanımı, Python belgelerinde önerilen minimum sayılarla eşleşir. Yineleme sayısını daha da artırmak, karmalarınızın hesaplanmasını yavaşlatacak ve dolayısıyla daha güvenli hale getirecektir.
os.urandom
her zaman kriptografik olarak güvenli bir rastgelelik kaynağı kullanır
hmac.compare_digest
içinde kullanılan is_correct_password
, temelde ==
dizeler için yalnızca operatördür, ancak kısa devre yapamaz, bu da onu zamanlama saldırılarına karşı bağışık hale getirir. Bu muhtemelen herhangi bir ekstra güvenlik değeri sağlamaz, ancak canımı da yakmaz, bu yüzden devam ettim ve kullandım.
İyi bir parola karmasını neyin oluşturduğuna dair teori ve parolaları hashing için uygun diğer işlevlerin bir listesi için bkz. Https://security.stackexchange.com/q/211/29805 .
t_sha.digest() + salt
. Çözülmüş karma şifrenin tam olarak 32 bayt olduğunu bildiğiniz için tuzlu karma şifresini çözdüğünüzde tuzu daha sonra tekrar bölebilirsiniz.