使用两个不同的盐对密码进行两次散列并将两个散列保存在同一台服务器上是否安全
Is it safe to hash a password two separate times with two separate salts and save both hashes on the same server
我希望我没有创建重复的问题。
我试图寻找已经存在的问题,但我没有找到任何东西。
我已经成功地设置了一个数据库,其中包含用于登录的用户名、salt 和散列密码。
为了检查密码,我将生成的哈希值与数据库中的哈希值进行比较,请参见下面的代码。
password_hashed_from_user = res[0][0]
salt = res[0][1]
key_generated = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), base64.b64decode(salt.encode('utf-8')), 100000, dklen=128)
key_encoded = base64.b64encode(key_generated).decode('utf-8')
if key_encoded != password_hashed_from_user:
logging.debug("Password was wrong:\n{}\n{}".format(key_encoded, password_hashed_from_user))
return "Username and/or password incorrect", False
现在的问题是我希望用户能够完全匿名,这意味着我希望用户能够使用生成的令牌进行身份识别,无法追溯到他的账户.
因此我需要将令牌存储在一个单独的 table 中,与具有凭据的令牌无关。
为了让用户不能作弊,每次登录时只向服务器请求一个新令牌(因此充当新用户),我想根据凭据计算令牌。
所以我想,我可以有一个单独的盐并根据密码创建一个新的散列(使用与代码示例中相同的方法)。
由于密码本身并未存储在服务器上,因此如果没有用户本身的密码,则无法生成此哈希值。
这样,生成的令牌总是相同的,只要盐没有改变。
所以我可以确保特定用户始终被识别为同一用户,同时用户可以确保我无法追溯他的操作。
背景
背景是我需要创建一个投票环境,人们必须在其中注册并证明自己以防止双重投票,但投票结果以及参与等不应追溯到特定用户。
由于这是我研究中的一个项目,我不能只使用现有的 frameworks/libraries.
现在我的问题是:
在同一台服务器上存储同一密码的两个不同的散列值是否安全,或者重复是否可以重新创建实际密码?两种盐将与其中一种哈希一起存储。另一个散列将在一个单独的、不相关的 table.
中
我总是在那个级别的加密方面遇到一些困难。
Is it safe to store two separate hashes of the same password with different salts on the same server or would the duplication make it feasible to recreate the actual password?
是的,很安全。
该声明背后的基本思想是盐将足够的唯一性“注入”到密码哈希可以使用的过程中,以确保两种不同的盐产生 unrelated-looking 哈希。 real-world 这方面的一个例子是担心两个不同的用户拥有相同的密码(但不同的盐)——这也不会泄露任何关于密码的信息,并且是引入盐的主要动机之一。
更加密的论点是你假设你的散列就像一个随机预言机——它为唯一的输入产生不相关的随机输出——在这种情况下,盐的唯一性隐藏了所有输出。或者你使用一个较弱的假设,即你的密码哈希是一个随机提取器,结合了一个 pseudo-random 函数(对于密码 hash-based password-hash 来说并非不合理),密码输入中有密钥。在这种情况下,假设密码未知且足够随机,所有唯一的盐都将映射到与随机输出无法区分的字符串,因此无法产生有关输出的任何信息。
或者,您也可以使用 Bellare, Ristenpart and Tessaro's definition 来实现密码散列安全性,这实际上是说“破解密码散列与猜测密码一样困难,如果所述散列是好的”。
我希望我没有创建重复的问题。 我试图寻找已经存在的问题,但我没有找到任何东西。
我已经成功地设置了一个数据库,其中包含用于登录的用户名、salt 和散列密码。 为了检查密码,我将生成的哈希值与数据库中的哈希值进行比较,请参见下面的代码。
password_hashed_from_user = res[0][0]
salt = res[0][1]
key_generated = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), base64.b64decode(salt.encode('utf-8')), 100000, dklen=128)
key_encoded = base64.b64encode(key_generated).decode('utf-8')
if key_encoded != password_hashed_from_user:
logging.debug("Password was wrong:\n{}\n{}".format(key_encoded, password_hashed_from_user))
return "Username and/or password incorrect", False
现在的问题是我希望用户能够完全匿名,这意味着我希望用户能够使用生成的令牌进行身份识别,无法追溯到他的账户.
因此我需要将令牌存储在一个单独的 table 中,与具有凭据的令牌无关。 为了让用户不能作弊,每次登录时只向服务器请求一个新令牌(因此充当新用户),我想根据凭据计算令牌。
所以我想,我可以有一个单独的盐并根据密码创建一个新的散列(使用与代码示例中相同的方法)。 由于密码本身并未存储在服务器上,因此如果没有用户本身的密码,则无法生成此哈希值。
这样,生成的令牌总是相同的,只要盐没有改变。 所以我可以确保特定用户始终被识别为同一用户,同时用户可以确保我无法追溯他的操作。
背景
背景是我需要创建一个投票环境,人们必须在其中注册并证明自己以防止双重投票,但投票结果以及参与等不应追溯到特定用户。 由于这是我研究中的一个项目,我不能只使用现有的 frameworks/libraries.
现在我的问题是:
在同一台服务器上存储同一密码的两个不同的散列值是否安全,或者重复是否可以重新创建实际密码?两种盐将与其中一种哈希一起存储。另一个散列将在一个单独的、不相关的 table.
中我总是在那个级别的加密方面遇到一些困难。
Is it safe to store two separate hashes of the same password with different salts on the same server or would the duplication make it feasible to recreate the actual password?
是的,很安全。
该声明背后的基本思想是盐将足够的唯一性“注入”到密码哈希可以使用的过程中,以确保两种不同的盐产生 unrelated-looking 哈希。 real-world 这方面的一个例子是担心两个不同的用户拥有相同的密码(但不同的盐)——这也不会泄露任何关于密码的信息,并且是引入盐的主要动机之一。
更加密的论点是你假设你的散列就像一个随机预言机——它为唯一的输入产生不相关的随机输出——在这种情况下,盐的唯一性隐藏了所有输出。或者你使用一个较弱的假设,即你的密码哈希是一个随机提取器,结合了一个 pseudo-random 函数(对于密码 hash-based password-hash 来说并非不合理),密码输入中有密钥。在这种情况下,假设密码未知且足够随机,所有唯一的盐都将映射到与随机输出无法区分的字符串,因此无法产生有关输出的任何信息。
或者,您也可以使用 Bellare, Ristenpart and Tessaro's definition 来实现密码散列安全性,这实际上是说“破解密码散列与猜测密码一样困难,如果所述散列是好的”。