加密电子邮件,散列密码并将其存储在数据库中?

时间:2011-10-26 08:51:00

标签: php mysql security web-applications

首先,我对加密和散列的理解:

  1. 加密 - 可以解密
  2. 哈希 - 不能不分散
  3. 构建Web应用程序时,我应该:

    1. 使用加密密钥加密电子邮件地址(将用于登录)。很高兴能够解密电子邮件地址供以后使用(例如通过电子邮件发送用户)
    2. 用盐哈希密码。没有人应该能够看到用户的密码,因此散列(因为它是单向的)是好的。
    3. 如果以上2点是正确的,我应该在哪里存储加密密钥和盐?

      如果我将它存储在数据库中,那么数据库是否会受到损害似乎毫无意义。但是,好处是我可以为每个用户分配唯一的加密密钥和盐。

      我应该在应用程序的配置中存储加密密钥和salt吗?如果数据库遭到破坏,至少加密密钥和盐也不会受到损害(希望如此)。这个问题是它可能意味着每个人都共享相同的加密密钥和盐。

      关于该怎么做的建议?

3 个答案:

答案 0 :(得分:1)

如果您根本加密电子邮件,则需要使用公用盐/密钥进行加密。否则,您将如何通过数据库中的电子邮件地址选择用户以检查散列密码是否正确?您不能每次都解密每个电子邮件地址。

总的来说,我认为加密电子邮件地址几乎没有什么好处。如果需要,请使用MySQL数据库加密,但不要在应用程序级别担心这一点。

用于散列密码的salt应该/需要是唯一的并且可以存储在数据库中,实际上它可以是散列本身的一部分。有关良好的实施,请参阅http://www.openwall.com/phpass/

答案 1 :(得分:1)

你的理解对我来说似乎是正确的。

密码:只应存储密码的哈希值以及用户特定的盐。盐可以是明文存储的,盐的原因是,攻击者不能为所有用户使用一个单一的彩虹表(构建彩虹表是昂贵的)。建议使用hash_hmac()函数。

电子邮件:我认为加密这些地址是个好主意,但无论如何,如果攻击者控制了服务器,他将能够恢复这些地址。我会将一个密钥放在一个单独的目录中,该目录位于Web根目录之外(无法直接从Web访问)。不要在没有解释的情况下将其写入文件中,扩展名* .php优于* .inc。如果您无法访问此类目录,请至少创建一个并使用.htaccess Deny from all保护它。

如果你需要在数据库中找到一个电子邮件地址,你可以另外存储一个哈希,这允许搜索不区分大小写(首先转到小写,然后生成哈希)。

答案 2 :(得分:0)

盐应该是每个用户,并且确实可以在数据库中;因此,盐的一点是,拥有数据库副本的人不能同时破解所有密码,但每个密码都是单独的。

至于加密密钥,这是一个更难的问题 - 绝对不会将其存储在数据库中;如果您的平台提供任何类型的受保护存储,您可能希望使用它。参见例如这是有用的答案:What's the best method to use / store encryption keys in MySQL