假设用户正在网站上创建帐户.用户提供的电子邮件地址保存在mysql中,但在保存之前进行哈希处理.这样一来,可能的黑客就不会看到电子邮件地址了.但另一方面,对于我或你("程序员"),没有办法看到用户是否正在尝试使用相同的电子邮件地址(我真的想要阻止)创建一个帐户.
问题:一般来说,您对解决这个问题的建议是什么?任何建议或解决方案表示赞赏?
问题:在散列电子邮件地址时,帐户会更加"安全"吗?
PS FYI,这个应用程序使用PHP作为服务器语言.
更新:
我使用BCRYPT与PHP内置盐.
我用mysqli.
Forien..
6
解决方案#1 - MySQL方法
unique
在email
列上添加索引.这将阻止添加具有相同email
字段的任何其他行.没错,顺利.
假设您的表是,users
并且您将电子邮件存储在email_hashed
:
ALTER TABLE users
ADD UNIQUE (email_hashed)
如果你已经有重复,在申请之前需要先清洁.
.
解决方案#2 - PHP方法
只需SELECT
使用该哈希散列电子邮件和数据库中的所有行.像那样:
$email = 'ex@example.com';
$hashed = someHashing($email);
$sql = ("SELECT id FROM users WHERE email_hashed = '$email'");
..
如果将获取任何行,那么您可以执行诸如显示消息,错误或任何内容之类的操作.
我建议使用两种解决方案.
编辑 - 关于...... BCrypt ......
所以是的,你正在使用BCrypt
.如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!).你会被所有人和更好的人嘲笑的那一个.
第一个(可笑的)是:
SELECT
从数据库整个表中包含每个可能存在的电子邮件哈希值
运行foreach() {}
循环遍历数据库中的每个哈希
在每个循环中比较哈希使用 password_verify()
如果有任何比较返回,true
则运行您自己的一些代码
第二个很简单:
CHANGE散列到md5
(使用md5('text')
功能)或sha256
更长的散列(使用hash('sha256','text')
)
另一个编辑
问题:在散列电子邮件地址时,帐户会更加"安全"吗?
我认为在StackOverflow上加注并不是问题,但由于它是"奖金",我会在这里提出一些想法.
我不是安全专家,所以我可能不知道什么.
无论如何,用密码散列密码BCrypt
并确保帐户上的任何内容都不能以任何不需要密码的方式进行编辑(如有缺陷的API或受损的管理仪表板).我认为你还应该保护易受攻击的数据(如姓名,地址,电话号码等)免受公共访问.
散列电子邮件只有我能想到的一个目的.在成功破解的情况下,倾倒所有数据库的人将无法获得任何单个电子邮件地址.那很好.但它也会阻止您发送简报,帐户到期通知和其他重要电子邮件.
在90%的网站中,我会说"哈希电子邮件,你疯了吗?",但如果你根本不需要重复使用电子邮件(除了注册邮件之外你不会发送任何电子邮件),并希望用户的电子邮件是非常安全,然后是的,散列可以证明是有用的.但请,不,BCrypt
P:
1> Forien..:
解决方案#1 - MySQL方法
unique
在email
列上添加索引.这将阻止添加具有相同email
字段的任何其他行.没错,顺利.
假设您的表是,users
并且您将电子邮件存储在email_hashed
:
ALTER TABLE users
ADD UNIQUE (email_hashed)
如果你已经有重复,在申请之前需要先清洁.
.
解决方案#2 - PHP方法
只需SELECT
使用该哈希散列电子邮件和数据库中的所有行.像那样:
$email = 'ex@example.com';
$hashed = someHashing($email);
$sql = ("SELECT id FROM users WHERE email_hashed = '$email'");
..
如果将获取任何行,那么您可以执行诸如显示消息,错误或任何内容之类的操作.
我建议使用两种解决方案.
编辑 - 关于...... BCrypt ......
所以是的,你正在使用BCrypt
.如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!).你会被所有人和更好的人嘲笑的那一个.
第一个(可笑的)是:
SELECT
从数据库整个表中包含每个可能存在的电子邮件哈希值
运行foreach() {}
循环遍历数据库中的每个哈希
在每个循环中比较哈希使用 password_verify()
如果有任何比较返回,true
则运行您自己的一些代码
第二个很简单:
CHANGE散列到md5
(使用md5('text')
功能)或sha256
更长的散列(使用hash('sha256','text')
)
另一个编辑
问题:在散列电子邮件地址时,帐户会更加"安全"吗?
我认为在StackOverflow上加注并不是问题,但由于它是"奖金",我会在这里提出一些想法.
我不是安全专家,所以我可能不知道什么.
无论如何,用密码散列密码BCrypt
并确保帐户上的任何内容都不能以任何不需要密码的方式进行编辑(如有缺陷的API或受损的管理仪表板).我认为你还应该保护易受攻击的数据(如姓名,地址,电话号码等)免受公共访问.
散列电子邮件只有我能想到的一个目的.在成功破解的情况下,倾倒所有数据库的人将无法获得任何单个电子邮件地址.那很好.但它也会阻止您发送简报,帐户到期通知和其他重要电子邮件.
在90%的网站中,我会说"哈希电子邮件,你疯了吗?",但如果你根本不需要重复使用电子邮件(除了注册邮件之外你不会发送任何电子邮件),并希望用户的电子邮件是非常安全,然后是的,散列可以证明是有用的.但请,不,BCrypt
P:
为什么你这么沉重的哈希?你似乎通过使一切都不可读的方式让自己更多地工作.如果您使用带有BCRYPT的内置salt,则salt会内置到哈希中,因此您需要运行并检查数据库中的每一行,但如果繁琐的话,它至少是可能的.实际上不建议使用自己的盐
@ user3892683好吧,我根本不知道**为什么你用'BCrypt`来发送电子邮件.如果密码来自同一来源,则用于比较两个哈希值.如果你坚持使用散列电子邮件,请使用`md5()`或`hash('sha256')`,否则你需要选择**整个**用户表并运行`foreach`循环来比较**每个**散列使用`password_verify()`会很糟糕.