Python是从数据库中存储和检索密码的最安全的方法

时间:2010-04-03 17:44:58

标签: python encryption passwords password-protection

希望将用户名和密码存储在数据库中,并且想知道最安全的方法是什么。我知道我必须在某处使用盐,但我不确定如何安全地生成它或如何应用它来加密密码。一些示例Python代码将不胜感激。感谢。

5 个答案:

答案 0 :(得分:37)

将密码+ salt存储为哈希和salt。看看Django是如何做到的:basic docssource。 在db中,它们将<type of hash>$<salt>$<hash>存储在单个char字段中。您还可以将这三个部分存储在不同的字段中。

设置密码的功能:

def set_password(self, raw_password):
    import random
    algo = 'sha1'
    salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
    hsh = get_hexdigest(algo, salt, raw_password)
    self.password = '%s$%s$%s' % (algo, salt, hsh)

get_hexdigest只是一些散列算法的薄包装器。您可以使用hashlib。像hashlib.sha1('%s%s' % (salt, hash)).hexdigest()

这样的东西

检查密码的功能:

def check_password(raw_password, enc_password):
    """
    Returns a boolean of whether the raw_password was correct. Handles
    encryption formats behind the scenes.
    """
    algo, salt, hsh = enc_password.split('$')
    return hsh == get_hexdigest(algo, salt, raw_password)

答案 1 :(得分:14)

我认为最好使用专用于散列密码的软件包,例如passlib:http://packages.python.org/passlib/,原因如我在此解释的那样:https://stackoverflow.com/a/10948614/893857

答案 2 :(得分:12)

我在这里回答:https://stackoverflow.com/a/18488878/1661689,@ Koffie也是如此。

我不知道如何强调所接受的答案是不安全的。它比普通文本更好,并且比无保留的哈希更好,但它仍然非常容易字典,甚至是暴力攻击。相反,请使用SLFF KDF ,如bcrypt(或至少 PBKDF2,10,000次迭代)

答案 3 :(得分:3)

如果您对应用程序的两个端点都有足够的控制权,那么绝对最好的方法是使用PAK-Z+

(编辑:推荐的原始版本SRP,但PAK-Z +有安全证明。)

答案 4 :(得分:0)

这是一种更简单的方法(取自effbot),如果长度大于8的密码不会有问题*:

import crypt

import random, string

def getsalt(chars = string.letters + string.digits):
    # generate a random 2-character 'salt'
    return random.choice(chars) + random.choice(chars)

用于生成密码:

crypt.crypt("password", getsalt())

*:长度大于8的密码从右向下剥离到8个字符长