如何从hashCode获取String

时间:2017-07-04 08:40:08

标签: java security passwords password-protection password-encryption

我正在开发一个项目,在那里我获得了我的密码字段值 hashCode ,并出于安全目的将该hashCode存储在DB中。现在我想从hashCode恢复密码。我该怎么做? 是否可以从hashCode 返回String值?如果不是,那么任何人建议我可以更好地以其他格式存储我的密码吗?

4 个答案:

答案 0 :(得分:3)

你知道有几个对象可以有相同的hash(),就像它在Object.hashCode()

的java文档中提到的那样
  

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

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

答案 1 :(得分:2)

哈希是一个单行函数(至少应该是这样),所以你无法从哈希中恢复密码。

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

通过良好的散列,具有相同散列的两个字符串的可能性非常低,因此您可以比较密码的散列(您可以存储的)和另一个字符串的散列,以确定它们是否相同。

另一点是hashCode不是产生这种哈希的好方法,因为我们可以很容易地拥有两个具有相同hashCode的对象。您可以使用PBKDF2BCrypt等实施。

答案 2 :(得分:1)

One technique is to brute-force it. Just run through every possible password. You can get through a surprising number if the the hashing algorithm is not designed to be computationally expensive.

If it's really String.hashCode then that's not cryptographically secure. Not by a long shot. As ΦXocę 웃 Пepeúpa ツ's answers aludes to, you can probably work backwards to one (of many) possible passwords by hand.

How should you do it? Use a well known cryptographic hash. Preferably one that can be made computationally expensive, such as bcrypt. Also you should salt the password (a random number combined with the password before hashing to prevent the use of compact precomputed lookup tables (rainbow tables) to crack on bulk). Essentially use someone else's library/system.

答案 3 :(得分:-1)

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

考虑一下:

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

两者都有相同的HashCode 2112,但保留完全不同的信息