我一直在使用客户端MySQL数据库,该数据库的用户密码以纯文本格式存储。正如我提到的那样,这是一个巨大的潜在风险,我们谈到了哈希密码(并不是说这是一个完整的解决方案,因为这些天可以相对轻松地“去哈希”)我遇到了一个我认为我的问题可能知道答案,但我想100%肯定。
该客户开发了一些桌面应用程序,要求用户插入用户/密码,当然都是纯文本。
因此,如果我们通过将每个密码字段更新为其MD5(例如)哈希值来对密码进行哈希处理,是否会修改桌面应用程序以对接收/输入的密码执行此哈希,然后比较它们(和登录)工作?< / p>
基本上,一直使用登录程序,但是使用散列密码,这对用户来说是一个透明且无法察觉的操作吗?
答案 0 :(得分:3)
是的,这是可行的,因为给定的哈希函数在呈现相同的输入时总是给出相同的结果。用户放弃的唯一能力是通过查看数据库来恢复密码,但这不是世界末日。
但是关于
的说明这些天可以相对轻松地“去散列”。
明智地选择你的散列函数以减轻这种风险 - 你可以here获得一些灵感(tl;博士考虑bcrypt,scrypt和pbkdf2)
应该影响您选择的一个标准是所选算法的现成可靠,可信赖的实现,快速Google搜索您正在使用的语言应该指向正确的方向。
答案 1 :(得分:3)
是的,这将起作用,并且对用户应该是透明的。
但是,它不是很安全。如果有人获得了登录数据库的副本,他们将获得散列密码。而且由于您通过线路发送散列密码,这就是他们需要知道的全部 - 他们不需要解开它。
最好通过线路发送明文密码,并在服务器应用程序或数据库查询中进行散列,例如
SELECT *
FROM users
WHERE username = :username AND password = encryption_function(:password)
有关MySQL可用的加密功能,请参阅Encryption and Compression Functions。
这样,如果有人获取了您的用户数据库,他们就需要解密密码才能打入您的应用程序。
无论哪种方式,您都应确保密码通过加密连接(例如SSL)传输。如果有人嗅到流量,这两种机制都可以让他们获得登录所需的一切。