2

字符串对于我的项目,我得到了我的密码字段值的的hashCode并存储在数据库中的哈希码安全目的。现在我想恢复从hashCode.How我可以做密码它? 是否有可能从hashCode返回字符串值。如果现在任何人都可以建议我更好的方式来存储我的密码在任何其他格式。我怎么能得到的hashCode

+2

如果你可以从哈希中恢复你的密码,哈希将如何提高你的安全性? – khelwood

+2

你不能。根据定义,哈希码不可逆。请参阅[标签:密码加密](您自己的标签)下的讨论。 – EJP

+1

[哈希在Java中 - >从哈希和盐](https://stackoverflow.com/q/38832367/608639)获取密码,[我如何检索哈希密码的原始明文密码](https:// stackoverflow (https://stackoverflow.com/q/12026149/608639),[使用Java加密和解密密码]。[/ q/23761505/608639] (https://stackoverflow.com/q/6592010/608639),[密码存储为散列值时检索密码](https://stackoverflow.com/q/1013581/608639)等 – jww

回答

-1

不是一个好主意,应该的hashCode永远不会被用作识别对象的证明平等......

考虑这个问题:

System.out.println("Aa".hashCode()); 
System.out.println("BB".hashCode()); 

都具有相同的hashCode 2112,但持有完全不同信息

+0

使用哈希码作为存储的密码完全依赖于这种技术。更重要的标准是密码不应该可恢复,并且哈希代码不应该是可逆的。 – EJP

+0

所以如果你的密码是Aa,你还会得到BB吗? –

+0

当然,这就是哈希码的工作原理:它们是一个从大值空间到小值空间的映射,因此不可逆,正如我刚才所说,这是真正的一点。密码的不可逆性是解决[公司破坏问题](https://stackoverflow.com/questions/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext -retrie/2287672#2287672)。你的例子不太现实,但是根据定义,这个星球上的每个安全系统都使用密码散列而不是密码加密。 – EJP

2

散列是一个单向函数(它应该至少),所以你不能从哈希中恢复密码。

但是,您可以将相同的散列应用于任何字符串,并将其与密码的散列进行比较,以便检查它们是否匹配。

具有良好的哈希,使用相同哈希的两个字符串的机会相当低,因此您可以比较密码(您可以存储的)的哈希和另一个字符串的哈希以确定它们是否相同。

另一点是hashCode不是产生这种散列的好方法,因为我们可以很容易地使用两个具有相同散列码的对象。您可以使用实现,如PBKDF2BCrypt

2

你知道几个对象可以有相同的散列(),因为它在Java文档中提到了Object.hashCode()

这是要求,如果两个对象不相等 *根据{@link java.lang.Object#equals(java.lang.Object)} *方法,然后调用每个 *上的{hashCode}方法*两个对象必须产生不同的整数结果。

很明显,你不能从同一个哈希码中恢复不同的对象,所以根本不可能,简单的逻辑。

1

一种技术是强制它。只需运行所有可能的密码。如果散列算法的设计不是计算成本昂贵的,你可以通过一个令人惊讶的数字。

如果确实是String.hashCode那么这不是密码安全的。不是由一个长镜头。正如ΦXocę웃Pepeúpaツ的答案一样,您可能手工倒退到一个(许多)可能的密码。

你应该怎么做?使用众所周知的加密哈希。优选地,可以使计算成本高昂的一个例如bcrypt。此外,您应该使用密码(在散列之前将密码与密码结合使用以防止使用紧凑的预先计算的查找表(彩虹表)来破解散列)。基本上使用别人的图书馆/系统。