【问题标题】:What is the best and safest way to store user email addresses in the database? [closed]在数据库中存储用户电子邮件地址的最佳和最安全的方法是什么? [关闭]
【发布时间】:2010-10-20 12:25:15
【问题描述】:

出于安全原因,是否值得在将用户电子邮件放入数据库之前对其进行加密?

我知道我们使用哈希和加盐密码,但这是另一回事,因为我们并不真正需要密码原件。电子邮件就不同了。

知道解密密钥无论如何都会在数据库附近的某个地方,加密电子邮件是否有意义?我想如果有人进入系统,他们也会找到密钥,如果不是立即,那么最终。

什么是最佳实践?如果我运行自己的服务器而不是在共享/虚拟主机上,是否还有其他可用选项?

编辑:我打算使用 SQL Server。不,它不是有安全要求的企业软件,只是我想到的一些娱乐网站。

【问题讨论】:

    标签: email encryption security


    【解决方案1】:

    希望这个答案也能回答你的问题。

    Is it worth encrypting email addresses in the database?

    简而言之,不,不值得加密用户电子邮件地址。您的想法是正确的,数据库泄露可能会导致某人还获得了破解您的加密所需的密钥。

    【讨论】:

    • 我见过这个,但它似乎很窄。我想听听有关电子邮件安全的任何想法。
    • 有时服务器入侵只允许攻击者查看数据库内容本身,保留密钥,从而保护数据。但是,如果指望这种情况,那就太可笑了。
    • 我必须同意其他人回答这个问题。无论如何,大多数电子邮件地址都会向天堂发送垃圾邮件。那些通常没有阻止垃圾邮件的人,如果他们的密码是“密码”并且有人找到了他们的电子邮件地址,那么再多的加密也不会拯救用户。不过,我会遵循@MaxVT 的建议并清理/验证电子邮件地址。如果您仍然担心安全性,使用建议的 @zoomzoom83 等数据库范围的加密也是一个好主意。
    • 在泄露电子邮件地址时,我不会认为垃圾邮件是真正的问题。通常,电子邮件地址实际上是个人详细信息,用于识别用户。数据库范围的加密仅在处理 SQL 注入时才有用,当然应该如此。
    【解决方案2】:

    取决于您访问地址的频率。如果您偶尔阅读它们,这可能是有道理的,但这将是我花时间研究的最后一个安全问题之一。

    【讨论】:

      【解决方案3】:

      我不加密用户电子邮件。重点是保护数据库;如果您真的想在存储电子邮件后使用这些密钥,无论如何都可以访问这些密钥。

      不过,请检查地址的有效性和可能的​​ SQL 注入。

      【讨论】:

        【解决方案4】:

        如果应用程序服务器和数据库位于不同的服务器上,通常对数据库的全部或部分进行加密会提高安全性。

        即使它们在同一台机器上,黑客也可能无法弄清楚您的密码存储在哪里(尽管我不会依赖它)。

        我通常不会在应用程序级别加密电子邮件,而是依赖大多数企业数据库提供的数据库范围加密。

        当然,如果您使用的是 MySQL 之类的东西,那么您别无选择,只能在应用程序级别进行。

        我通常会告诉我的客户加密数据库是不值得的,但是如果您有更严格的隐私要求,这样做可能是有意义的。

        【讨论】:

          【解决方案5】:

          我认为当人们可以进入您的数据库时,您无论如何都会被搞砸:)

          仅仅加密您的电子邮件地址没有多大意义。除了您的数据库中还有很多您不希望被收集的其他信息之外,解密密钥确实在您打开数据库的同时触手可及。

          我想建议在更高级别上找到您的安全层和数据完整性。所以防止人们进入你的数据库。

          为什么电子邮件地址如此重要?无论如何,大多数人都会收到垃圾邮件,否则他们的电子邮件地址将在网络上的某个地方可用。

          【讨论】:

            【解决方案6】:

            加密数据库内容始终是一个棘手的问题。显然,除非内容可以未加密,否则内容是无用的,并且如果必须在没有人为干预的情况下进行,那么您将密文和密钥都存储在某处。如果那个某处在同一台机器上,那么人们可能会想知道你为什么还要打扰。

            嗯,您可能想这样做有几个原因。一是因为某些公司政策要求您这样做。另一个可能是您的数据库位于比访问它的机器更恶劣的环境中。

            一般来说,加密数据库内容不会为您赢得任何奖项,但如果您能证明这一点,那么您显然至少有这样做的动力。

            【讨论】:

              【解决方案7】:

              如果您将来需要该电子邮件地址,则必须以纯文本形式存储它们。

              当然,您可以对它们进行加密,但是,在这种情况下,这实际上是通过隐蔽性实现的安全性。基本上,如果您的应用程序的边界是安全的,则其中的数据可以是纯文本。在此处加密会增加您处理数据的复杂性,但并不能真正阻止攻击者获取您的原始数据。

              正如您所说,如果他通过了您的外围防御,他很可能很容易获得您的解密密钥来解密电子邮件数据。加密可能会稍微减慢坚定的攻击者,但不会为您的数据增加任何真正的安全性。

              最好的方案是对电子邮件地址进行哈希处理(使用盐!)并存储它。这允许您根据输入值(例如)检查电子邮件地址并验证输入的电子邮件地址是否与您存储的相同,当然,这样做的主要缺点是您无法知道电子邮件是什么address 没有那个额外的价值,所以如果你想(例如)定期给你的用户发邮件,那你就不走运了。

              我怀疑您正在存储电子邮件地址,因为它是有用的数据,并且您想要对它做一些事情(例如发送电子邮件:) 在这种情况下,加密只会增加工作的开销使用这些数据,而获得的回报却很少。

              在这种情况下,我将专注于保护对数据库本身的访问(即您的“外围”防御)并确保它们尽可能强大,同时将数据库中的数据以纯文本形式保留。

              【讨论】:

              • 很好的分析,很有见地。 +1
              【解决方案8】:

              总的来说,我同意其他人的说法,即不值得付出努力。但是,我不同意任何可以访问您的数据库的人也可以获取您的密钥。对于 SQL 注入当然不是这样,对于以某种方式丢失或被遗忘的备份副本来说可能不是这样。而且我觉得电子邮件地址是个人信息,所以我不在乎垃圾邮件,而是在乎地址泄露后的个人后果。

              当然,当您害怕 SQL 注入时,您应该确保禁止此类注入。并且备份副本应该自己加密。

              不过,对于某些在线社区,成员可能绝对不希望其他人知道他们是成员(例如与心理保健、经济帮助、医疗和性建议、成人娱乐、政治等相关的内容)。在这些情况下,尽可能少地存储个人详细信息并加密那些需要的信息(请注意,数据库级加密不会阻止使用 SQL 注入显示详细信息),这可能不是一个坏主意。同样:将电子邮件地址视为个人详细信息。

              对于您的娱乐网站,情况可能并非如此,您应该专注于通过 SQL 注入来禁止SELECT * FROM,并确保访问者无法通过更改 URL 以某种方式获取他人的个人资料或订单信息。

              【讨论】:

              • 我将数据库转储上传到 GitHub,因此可以通过某种方式来混淆电子邮件。
              【解决方案9】:

              计算机安全中最常被引用的真理之一是 只有真正安全的计算机是埋在混凝土中的 关机,网线断了。

              考虑到安全存储电子邮件地址的最佳方式? 根本不要存储它们!

              tl;dr您需要他们的电子邮件地址,或向他们发送电子邮件的方式吗?要么相信比你做得更好的人,要么根本不使用电子邮件地址。

              为什么需要记录客户的电子邮件地址?我遇到的唯一原因是:

              • 帐户确认和身份验证
              • 交易和营销电子邮件

              确认与认证

              我们想要的核心是两步验证:他们知道的东西和他们拥有的东西。他们知道的东西是密码,而且很容易证明,因为他们将是唯一知道密码的人。他们拥有的东西更难证明,传统上我们使用电子邮件地址,因为它很容易验证。这些天虽然我们可以使用其他东西:

              • 手机
              • 拥有可信网站(Facebook、Google、Twitter)的帐户

              手机验证很简单。使用twilio.com 之类的服务向他们发送短信,并要求他们发回确认码。我们现在知道手机属于想要注册的客户。使用 OpenID,您可以通过其他受信任的站点验证现有帐户,并由他们处理确认过程。

              为了让客户进行身份验证,他们提供的只是他们的手机号码和密码,或 OpenID 身份验证令牌。两者都不需要电子邮件地址(OpenID 提供商可能会,但那不是您的责任)。

              如果这些都不是一个选项,那么您仍然可以确认电子邮件地址,然后将其用于身份验证。确认只需要存储一个唯一的令牌并将一个链接发送到电子邮件地址。存储电子邮件地址的加盐哈希,并使用它来匹配帐户,就像我们处理密码一样。

              交易和营销电子邮件

              我们要存储电子邮件地址的真正原因!所以我们可以向他们发送我们认为他们需要的东西的报价,这样他们就可以在不阅读的情况下删除它。说真的,电子邮件是最好的媒介吗?如果我们有一个 OpenID 帐户,那么为什么不将它用于通知呢?发送 Facebook 消息或在他们的墙上写字,在 Twitter 上@提及他们,向他们的手机发送短信,构建应用程序并向他们推送通知。有很多渠道比电子邮件更有效。

              如果您想使用电子邮件,请使用MandrillMailChimp 等电子邮件平台。当他们注册时,在 MailChimp 上的邮件列表中创建订阅者。将订阅者 ID 与帐户一起存储。对于交易电子邮件(重置密码、帐户更新),获取订阅者并将存储的电子邮件传递给 Mandrill 以发送电子邮件。对于大众营销,只需发送到 MailChimp 中的邮件列表。

              唯一存储在数据库中的是订阅者 ID。它还提供了使用电子邮件平台、取消订阅、打开和点击率、电子商务跟踪等的所有好处。电子邮件平台将更好地交付您的电子邮件。他们在保护数据隐私方面也会比您做得更好。让他们完成数据库安全方面的艰苦工作,这样您就可以专注于吸引更多客户。

              【讨论】:

                【解决方案10】:

                是的,如果你用盐散列它可能对用户有帮助。我有一个代码,之前我使用了盐和哈希,然后我可以解密它。流程是,一旦用户注册您,然后对其进行哈希和加盐(加密过程)。然后,如果您需要获取加密数据,则会进行解密。

                【讨论】:

                • 我认为您对“哈希”和“加密”感到困惑......
                猜你喜欢
                • 2021-05-06
                • 2018-12-26
                • 2016-06-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-19
                • 2015-11-02
                • 2011-06-14
                相关资源
                最近更新 更多