0

我一直在使用一个客户端 MySQL 数据库,它的用户密码以纯文本形式存储。正如我提到的,这是一个巨大的潜在风险,我们谈到了对密码进行哈希处理(并不是说这是一个完整的解决方案,因为这些天可以相对容易地“去哈希”)并且我遇到了一个我认为我认为的问题可能知道答案,但我想 100% 确定。

这个客户端开发了几个桌面应用程序,要求用户插入他们的用户/密码,当然都是纯文本的。

因此,如果我们通过将每个密码字段更新为其 MD5(例如)散列来对密码进行散列,那么修改桌面应用程序以对接收/输入的密码执行此散列然后比较它们(和登录)是否有效?

基本上,登录过程一直是这样,而是使用散列密码,这对用户来说是透明且不明显的操作吗?

4

2 回答 2

3

是的,这会起作用,因为给定的散列函数在呈现相同的输入时总是给出相同的结果。您的用户唯一会失去的能力是通过查看数据库来恢复密码,但这并不是世界末日。

然而,关于

现在可以相对容易地“去散列”。

明智地选择你的散列函数来降低这种风险——你可以去这里寻找一些灵感(tl;博士考虑 bcrypt、scrypt 和 pbkdf2)

应该影响您选择的一个标准是存在可供使用的、可信赖的所选算法的实现,在 Google 上快速搜索您正在使用的语言应该会为您指明正确的方向。

于 2013-06-25T00:46:49.600 回答
3

是的,这将起作用并且应该对用户透明。

但是,它不是很安全。如果有人获得登录数据库的副本,他们将获得散列密码。而且由于您通过网络发送散列密码,这就是他们需要知道的全部内容 - 他们不需要取消散列。

最好通过网络发送明文密码,并在服务器应用程序或数据库查询中进行哈希处理,例如

SELECT *
FROM users
WHERE username = :username AND password = encryption_function(:password)

有关MySQL 可用的加密函数,请参阅加密和压缩函数。

这样,如果有人获取了您的用户数据库,他们将需要解密密码,以便他们可以用来侵入您的应用程序。

无论哪种方式,您都应该确保密码是通过加密连接(例如 SSL)传输的。如果有人嗅到流量,任何一种机制都允许他们获取登录所需的任何内容。

于 2013-06-25T00:47:17.263 回答