是否可以获取原始哈希值,然后将其解码回原始字符串?
hash('sha256', $login_password_for_login)
给我一个哈希值,如下所示,但我想从哈希值转回原始字符串。
使用$login_password_for_login = 12345
,hash
函数为我提供了以下信息:
5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5
我希望能够检索我的登录密码的原始号码或字符串。如何反转哈希并获取原始字符串?
答案 0 :(得分:1)
您不'解密'哈希值,因为哈希不是加密。
对于撤消哈希函数以获取原始字符串,无法从哈希到原始项目,因为哈希是单向操作。你可以获取一个项目并获得一个哈希值,但你不能获取哈希并得到原始项目。
请注意,哈希不应与加密混淆;加密是一个不同的过程,您可以在其中获取项目,使用某种类型的密钥(预共享或对称密钥,如PGP密钥)对其进行加密,然后再对其进行解密。哈希不会那样工作。
在评论中,您表明您正在尝试在数据库中保存密码。问题是,你不希望有人能够破解数据库,能够立即解密密码,这就是为什么哈希很有吸引力。
然后,我们的想法是,你会考虑使用salted哈希,在每个用户的基础上只将salt存储在数据库中作为自己的记录,然后存储他们的盐渍哈希值数据库中的原始密码字符串。
然后,要验证密码输入是否正确,从DB获取salt,获取给定密码的用户输入,然后使用DB中的salt,获取该输入的salted哈希值。获取结果哈希并将其与存储在DB中的盐渍哈希进行比较。如果匹配,则您有一个经过验证的密码;如果它们不匹配,则无效。
这样,实际上没有任何密码的解密,这意味着在您网站的数据泄露情况下,密码不易被检索。 (这并不排除有人违反您的数据库,复制数据并尝试强制密码,但取决于您对密码复杂性的强制执行以及黑客想要实际获取凭据的努力,不太可能发生)
我会用我理解的语言写一个这样的例子,但由于你没有定义你正在使用的语言,所以我不可能在这里为你写一个有用的例子。 / p>
也就是说,如果你正在使用PHP,你可能会发现this document on crackstation.net关于正确进行安全盐渍密码哈希的问题;已经有PHP实现正确执行此操作,因此您不必编写自己的代码。
答案 1 :(得分:0)
哈希不能解密,因为它们不是加密的。
我相信您对“哈希”的定义是错误的。尽管散列输出通常看起来类似于加密函数,但散列实际上是一种非常有损的数据压缩形式。当我说“极度有损”时,我的意思是“所有原始数据都被丢弃了为了得到固定的长度。”由于没有原始数据,因此无法解密哈希。
话虽如此, 散列可用于模拟加密。 您要做的是,当一个人注册时,您将创建一个包含其用户名散列的元组和密码。然后,当有人尝试登录时,您可以比较以下哈希值*:
import hashlib
from login_info import logins # This is an array containing the tuples.
def hasher(string: str) -> bytes:
stringer = bytes(string)
return hashlib.sha256(stringer).hexdigest()
def login(username: str, password: str) -> int: # Returns 0 if login correct, else 1.
user = hasher(username)
pass = hasher(password)
for i in range(len(logins)):
if logins[i][0] == user:
if logins[i][1] == pass:
return 0
else:
return 1
else:
return 1
* Nota Bene:我以Python 3为例,因为我的PHP和Javascript有点不实用。