Java 如何打乱一根绳子?

Java 如何打乱一根绳子?,java,cryptography,Java,Cryptography,在比较密码时,始终存在将密码保存在内存中的问题。相反,在引入密码的那一刻,我想用它的md5快照(或任何其他哈希生成函数)替换它 假设您有一个键值对String password=“Secret”,将“secret”置乱为唯一密码的最简单方法是什么?一旦您在字符串中输入了密码,您就已经失败了,因为您无法将其归零。它将在堆上逗留,直到另一个对象偶然覆盖它。您必须确保的第一件事是只将密码保存在char[]中,并尽快手动将其归零。至于散列,JDK提供了对它们的支持。签出。您可以使用Messagedige

在比较密码时,始终存在将密码保存在内存中的问题。相反,在引入密码的那一刻,我想用它的md5快照(或任何其他哈希生成函数)替换它


假设您有一个键值对
String password=“Secret”
,将“secret”置乱为唯一密码的最简单方法是什么?

一旦您在
字符串中输入了密码,您就已经失败了,因为您无法将其归零。它将在堆上逗留,直到另一个对象偶然覆盖它。您必须确保的第一件事是只将密码保存在
char[]
中,并尽快手动将其归零。至于散列,JDK提供了对它们的支持。签出。

您可以使用Messagedigest类生成哈希


但我认为重要的是不要将整个密码存储在内存中——如果您是通过某种字节流读取密码,请使用message digest类的更新方法将其逐字节直接读取到message digest中,然后在完成读取后调用digest以获得结果。

使用MessageDigest。大概是这样的:

MessageDigest algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(password.getBytes());
byte bytes[] = algorithm.digest();
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
    String hex = Integer.toHexString(0xff & b);
    if(hex.length() == 1)
        sb.append('0');
    sb.append(hex);
}
result = sb.toString();

另外,如果MD5算法不可用,请注意getInstance方法可能引发的NoSuchAlgorithmException。

可能会在上得到一些更好的答案,您可以尝试将其包装在WeakReference中。@LanguagesNameAfterCofee这有什么帮助?@MarkoTopolnik它会尽快从内存中释放它。当然,你的方法更好。@LanguagesNamedAfterCofee问题是,你的
WeakRef
可能会在你仍然需要它的时候被清除,而另一方面,即使清除了ref,对象本身也不会从内存中删除。甚至不能保证它什么时候会被GC'd。这就是为什么我问它在这件事上有什么帮助。