如何从 hashCode 获取字符串

how can I get the String from hashCode

我正在做一个项目,在该项目中我获得了密码字段值的 hashCode 并将该 hashCode 存储在数据库中以确保安全 purposes.Now 我想从中恢复密码hashCode.How 我可以吗? 是否有可能从 hashCode 中取回字符串值?如果不行,谁能建议我一个更好的方法来存储我的密码还有其他格式吗?

这不是个好主意,永远不要将 hashCode 用作标识符来证明对象的相等性...

考虑一下:

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

两者具有相同的 HashCode 2112,但持有完全不同的信息

散列是一种单向函数(至少应该是),因此您无法从散列中恢复密码。

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

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

另一点是 hashCode 不是生成此类哈希的好方法,因为我们很容易拥有两个具有相同哈希代码的对象。您可以使用 PBKDF2BCrypt 等实现

您知道多个对象可以具有相同的 hash(),正如 java 文档中提到的 Object.hashCode()

It is not required that if two objects are unequal * according to the {@link java.lang.Object#equals(java.lang.Object)} * method, then calling the {@code hashCode} method on each of the * two objects must produce distinct integer results.

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

一种技术是暴力破解。只需 运行 通过每个可能的密码。如果散列算法的设计不是计算量大的话,你可以通过一个惊人的数字。

如果它真的是 String.hashCode 那么这在密码学上是不安全的。不是由一个长镜头。正如 ΦXocę 웃 Пepeúpa ツ 的回答所暗示的那样,您可能可以手动回溯到一个(许多)可能的密码。

你应该怎么做?使用众所周知的加密哈希。最好是可以使计算成本高的一种,例如 bcrypt。您还应该对密码加盐(一个随机数在散列之前与密码结合,以防止使用紧凑的预计算查找表(彩虹表)来批量破解)。本质上是用别人的library/system.