【发布时间】:2011-05-31 18:35:45
【问题描述】:
我想做一张桌子。我的用户给我他们的电子邮件地址,然后将其存储在数据库中。如果他们需要将登录详细信息重新发送给他们,他们可以输入此电子邮件地址,系统将检查它是否存在,如果存在,将向他们发送一封包含登录详细信息的电子邮件。
什么数据库结构最适合这个?
存储入侵数据库的每个人都看不到的电子邮件的最佳方法是什么?请记住,我只会根据数据库检查另一个值,而不需要将实际电子邮件地址存储为输出?
【问题讨论】:
我想做一张桌子。我的用户给我他们的电子邮件地址,然后将其存储在数据库中。如果他们需要将登录详细信息重新发送给他们,他们可以输入此电子邮件地址,系统将检查它是否存在,如果存在,将向他们发送一封包含登录详细信息的电子邮件。
什么数据库结构最适合这个?
存储入侵数据库的每个人都看不到的电子邮件的最佳方法是什么?请记住,我只会根据数据库检查另一个值,而不需要将实际电子邮件地址存储为输出?
【问题讨论】:
如果您只需要检查电子邮件是否在系统中,您可能应该存储某种散列(MD5 或 SHA,两者都是 MySQL 本机支持的)而不是实际的电子邮件地址。哈希是一种单向加密,这意味着您无法从转换后的哈希文本中检索电子邮件地址,但您可以从电子邮件地址重新创建哈希。
这里对如何在 MySQL 中存储 SHA1 字符串进行了很好的讨论: Storing SHA1 hash values in MySQL
如果您的表格如下所示:
userid: INT
emailhash: CHAR(40)
您可以通过如下查询来检查电子邮件地址是否存在:
SELECT userid FROM tablename WHERE SHA1([e-mail address from user]) = emailhash;
如果它返回结果,那么您知道与电子邮件地址匹配的用户 ID,您可以向您从用户那里收集的电子邮件地址发送电子邮件。 (请记住,您将无法从数据库中检索电子邮件地址。)
这里有更多关于 MySQL 加密算法的注释: http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html
【讨论】:
什么数据库结构最适合这个?
使用电子邮件为 varchar 的表格。您应该使用 utf8,以便人们可以在他们的电子邮件中使用时髦的字符并正确处理。
存储入侵数据库的每个人都看不到的电子邮件的最佳方法是什么?
您可以使用 md5 和“盐”对值进行散列 - 盐只是一些额外的东西(在本例中是一个字符串),可以为结果添加更多随机性。这样,如果有人知道哈希和原始电子邮件地址,他们就无法简单地找出您使用的哈希函数。
然后,如果您想查看电子邮件地址是否已经存在 - 获取提供的电子邮件地址,添加盐,进行哈希,检查该值是否在数据库中。
如果你这样做,你就知道哈希有多长,所以你可以把它变成一个长度正确的字符。这将使索引/查询更快。
也就是说,没有理由对电子邮件地址执行此操作。密码应始终以散列形式存储。电子邮件地址是公开的东西,但如果其他人知道它并不“坏”。如果有人知道某人的密码,那就“不好”了。
尽管提供更多信息,您应该尽可能地防止人们入侵您的数据库。如果他们可以破解您的数据库,他们也可能能够破解您的代码。如果他们这样做,他们可以看到您的哈希函数和盐。
【讨论】:
此外,您不应该重新发送他们的密码,因为无论如何您都不应该使用明文形式。
要么发送一个新密码,(在使用新密码之前让旧密码正常运行,以防止有人更改另一个密码)或发送带有哈希的链接以重置密码。
【讨论】: