让我们说用户正在网站上创建一个帐户。用户提供的电子邮件地址保存在mysql中,但在保存之前进行哈希处理。这样一来,可能的黑客就不会看到电子邮件地址了。但另一方面,对于我或你("程序员"),无法看到用户是否正在尝试创建具有相同电子邮件地址的帐户(我真的想要阻止)
问题:一般来说,您有什么建议来解决这个问题?任何建议或解决方案都表示赞赏?
问题:帐户是否会更加安全"在散列电子邮件地址时?
P.S。仅供参考,此应用程序使用PHP作为服务器语言。
更新:
答案 0 :(得分:6)
在unique
列上添加email
索引。这将阻止添加具有相同email
字段的任何其他行。没错,顺利。
假设您的表格为users
,并且您在email_hashed
中存储了电子邮件:
ALTER TABLE users
ADD UNIQUE (email_hashed)
如果您已经有重复项,则需要在申请前先进行清洁。
只需使用该哈希从数据库散列所有行的电子邮件和SELECT
。像那样:
$email = 'ex@example.com';
$hashed = someHashing($email);
$sql = ("SELECT id FROM users WHERE email_hashed = '$email'");
..
如果要获取任何行,则可以执行显示消息,错误或任何内容的操作。
我建议使用这两种解决方案。
所以是的,你正在使用BCrypt
。如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!)。你会被所有人和更好的人嘲笑的那一个。
第一个(可笑的)是:
SELECT
以及每个可能存在的电子邮件哈希foreach() {}
遍历数据库中的每个哈希password_verify()
true
,则运行您自己的一些代码第二个很容易:
md5
(使用md5('text')
功能)或sha256
进行更长时间的散列(使用hash('sha256','text')
) 问题:帐户是否会更加安全"在散列电子邮件地址时?
我认为在 StackOverflow 上加注是没有问题的,但是因为它是一个奖励"我会在这里提出一些想法。
我不是安全专家,所以我可能不知道什么。
无论如何,使用BCrypt
散列密码,并确保帐户中的任何内容都无法以任何方式编辑,不需要密码(例如有缺陷的API或受损的管理信息中心) )。我认为你还应该保护易受攻击的数据(如姓名,地址,电话号码等)免受公共访问。
哈希电子邮件只有我能想到的目的。在成功破解的情况下,倾倒所有数据库的人不会获得任何单个电子邮件地址。那很好。但它也会阻止您发送简报,帐户到期通知和其他重要电子邮件。
在90%的网站中,我会说"哈希电子邮件,你疯了吗?",但如果你根本不需要重复使用电子邮件(你赢了'除了注册之外发送任何电子邮件,并希望用户的电子邮件非常安全,然后是的,散列可以证明是有用的。但请不要BCrypt
:P
答案 1 :(得分:2)
正如S.L Barth所述,您可以将给定的电子邮件地址哈希,也可以在字段失去焦点时使用ajax请求,然后检查数据库中是否存在该哈希值,如果返回的行数是> 0然后javascript可以输出一条消息,说明此帐户已经注册。
在表上创建唯一索引也可以工作,但在尝试将数据写入数据库之前,这不会反馈问题,这可能为时已晚。最终用户无需循环。
如果您的电子邮件地址使用盐进行哈希处理,并且您无法再针对添加的同一电子邮件地址进行确认,那么如果无法解密,则存储电子邮件地址的重点是什么?修改你的方法。使用像Password_hash()
和password_verify()
答案 2 :(得分:1)
当您对电子邮件进行哈希处理以将其插入数据库时,请检查是否已存在此类哈希电子邮件,就像每次用户登录时检查一样。
如果您对所有内容进行哈希处理,帐户会更安全,但这样会很难恢复/重置丢失的用户名/密码,因为您不知道发送重置信息的电子邮件
答案 3 :(得分:0)
散列了用户输入的电子邮件ID并检查它是否存在于mysql电子邮件列中(如果它存在)将导致一行然后禁用按钮否则允许用户插入
使用select * from user where email =“hashed(email_id_entered)”
如果(结果大于0) 禁用按钮 其他 使