在传输过程中保持密码安全

时间:2015-01-19 10:34:33

标签: security hash passwords password-hash

在我的网络应用程序中,我正在实施一个用户无法选择的密码黑名单。正如Jeff God Login帖子中所述,这是因为某些密码非常常用,并且存在于强制执行工具使用的readily available wordlists中。

我原计划将列入黑名单的密码存储在数据库表格中(以明文形式显示),并带有MD5 hash of it as a Functional Index。因此,当查询发送到服务器时,它看起来像这样:

SELECT 1 
FROM blacklist AS a 
WHERE MD5(a.password) = 'MD5stringOfPasswordSubmitted';

我不认为这些密码的“明确”存储是一个问题,因为密码是黑名单。没有用户可以将其设置为其中之一..所以谁关心此表中的密码是否以明文形式存储。

但是,这个查询传输到数据库服务器是一个我应该担心的问题吗?

如果我的用户正在尝试设置密码,那么应用程序将MD5密码发送给数据库,以便查询此黑名单表。如果没有返回结果,应用程序将允许他们将其作为密码(只要满足其他验证要求)。

这是我应该担心的吗?

这是否可以通过其他方式实现,以便密码用户尝试将 保持安全?是否真的有必要通过Bcrypt存储盐渍哈希(就像在我的用户表中一样),即使只是为了这个黑名单用法?在我的应用程序的本地目录结构中使用YAML文件会有同样的风险吗?

目的是防止用户选择常见的密码,并以非常快的方式检查(因此MD5)作为验证过程的一部分。

3 个答案:

答案 0 :(得分:0)

我没有看到查询的传输可能是一个问题。如果您的Web应用程序执行MD5编码并且攻击者拦截了与数据库的通信,则他无法从中获取用户的密码。

MD5对于存储密码是不安全的,因为攻击者可能能够找到导致相同哈希值(冲突)的密码,但是无法将哈希值转换回源自它的明文。 / p>

如果您在查询数据库时担心泄漏其他敏感数据,可以考虑加密通信渠道。

答案 1 :(得分:0)

我不担心密码的传输,因为它们是使用单向算法进行哈希处理(如用户18044指出的那样),但是在MD5的弱点上进一步扩展 - 我不会在特别是如果你不使用盐。原因是因为MD5 rainbow tables是为一组非常大的密码组合创建的。事实上,在搜索MD5表或使用online services之后,您提到的密码列表很可能是通过提交MD5哈希来提供密码(如果密码已经存在)以前破解或在某些表中)。我建议使用salt或使用其他算法,如SHA-256。安全性是我的专长,我有一个能够以每秒数百亿的速度破解MD5哈希的装备,但是如果涉及盐,它会减慢我的速度或阻止我所有(如果盐不知道)。同样的装备可以破解SHA-256但是它需要更长的时间才能破解每个装备,因为SHA-256会对自身进行足够多次迭代以使每次迭代变得足够慢以使破解变得不可行。

正如已经提到的,我当然会以任何一种方式使用SSL来更好地保护所有传输的数据。

答案 2 :(得分:0)

  

但是,这个查询传输到数据库服务器是一个我应该担心的问题吗?

这取决于您的网络拓扑。 e.g。

  • 数据库服务器是否在同一个私有本地网络上?然后这是低风险。
  • 数据库服务器是否在同一网络上,但与其他计算机和用户共享。那么这是中等风险(您需要信任所有其他机器和用户)。
  • 数据库服务器是否跨越互联网?那么这就是高风险。

根据您接受的风险级别,您可能希望使用SSL / TLS保护与数据库的连接。

即使使用MD5进行哈希处理,MD5也被认为是弱哈希算法,因此如果MITM在数据库中查询密码时会抓取密码,则可以通过John the Ripper之类的工具使用单词来运行密码。列出并拦截用户设置的任何密码。

您可以尝试使用另一种算法对此查询进行哈希密码 - 但这意味着在您的系统上实现“静态盐”(称为“辣椒”),以避免对截获的数据进行任何哈希比较。简单地连接SSL / TLS可能要容易得多。

对于密码本身的存储(一旦通过检查),请务必使用安全算法,例如bcrypt或scrypt。