【问题标题】:Should I hash a user-entered password if I only use it once?如果我只使用一次,我应该散列用户输入的密码吗?
【发布时间】:2020-06-24 22:00:55
【问题描述】:

我正在编写一个 Java 程序,它只是登录到一个网站并执行一些不相关的事情。我预计我以外的人会使用它。所以,我有一个对话框(在终端中),要求用户输入密码,然后使用该密码登录。之后,我不需要密码。

我使用 java.io.console 中的 readPassword() 方法,该方法将密码存储在 char[] 中。完成密码后,我遍历数组并将所有值设置为 0。

这就够了吗?我应该对密码进行哈希处理吗?老实说,我真的不明白散列密码的意义。我的 char 数组可能被破坏的唯一方法是攻击者可以访问我的程序内存。但是,如果攻击者可以访问我的程序内存,那么即使我散列,当用户输入/将其转换为String 以使用它登录时,他们是否无法看到密码?

感谢您的帮助!作为参考,我正在使用 HTMLUnit 库进行登录。不确定这是否相关。

【问题讨论】:

  • 如果你输入密码,在本地使用然后清除它,似乎没有任何理由也为它做一个哈希。
  • 只是出于好奇,“本地”是什么意思?
  • 本地而不是在其他任何地方发送密码。
  • 我的意思是我把它发送到网站登录?我猜你是指将它发送到另一台机器?
  • 如果你必须自己发送密码才能登录,那么散列仍然没有用。

标签: java passwords password-protection


【解决方案1】:

不,如果您只是使用并丢弃密码,则不应散列密码。

散列用于长期密码存储,通常在任何过程描述中都会明确说明:

这里是Wikipedia

如果密码文件被泄露,将所有用户密码存储为明文可能会导致严重的安全漏洞。减少这种危险的一种方法是只存储每个密码的哈希摘要。

这里是NIST 800-63B

[The Key Derivation Functions' (i.e. password hasher's)] 目的是让每个密码猜测都被攻击者尝试 谁获得了密码哈希文件昂贵,因此猜测攻击的成本很高 或禁止。

这里是Wired

当黑客入侵一家公司以访问其用户密码集合时,他们发现和窃取的内容并不会以人类可读的形式存储——至少在公司甚至假装安全的情况下。取而代之的是,密码缓存通常被转换为加密哈希的集合 [..] 以防止它们被滥用。

其次,密码散列仅适用于验证密码,即当有人登录到您的程序/服务时。如果您使用用于通过不同服务进行身份验证的密码输入,则不适用。像密码管理器这样的程序不会散列存储的密码,即使它会长期存储它们,因为验证密码的是各种远程服务而不是密码管理器(但是,它加密密码) .

散列用于登录某处的密码然后立即丢弃是没有意义的。

但是,请注意您应该尽可能将char[] 转换为字符串。如果你把它变成一个字符串,你就会失去对字符数据生命周期的控制。当/如果收集字符串时,不能保证数据在内存中被覆盖,并且它可能比整个 JVM 更持久。 Heartbleed、Spectre 和 RowHammer 等各种备受瞩目的漏洞利用可以利用在内存中停留时间超过必要时间的密码。

【讨论】:

  • 不幸的是,我想我必须为一个部分使用一个字符串。我使用 htmlunit 中的 setValueAttribute() 函数在 html 表单中设置密码值字段。不幸的是,该函数接受一个字符串。我真的没有办法解决这个问题
猜你喜欢
  • 2015-06-28
  • 2014-09-26
  • 2012-08-18
  • 2021-05-19
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
相关资源
最近更新 更多