在数据库中存储用户电子邮件地址的最佳和最安全的方法是什么?

时间:2009-04-20 07:43:51

标签: email encryption security

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

我知道我们哈希和盐密码,但这是另一个故事,因为我们真的不需要密码原件。电子邮件与众不同。

知道解密密钥无论如何都要靠近数据库,加密电子邮件是否有意义?我想如果有人进入系统,他们也会找到钥匙,如果没有立即,那么最终。

最佳做法是什么?如果我运行自己的服务器而不是共享/虚拟主机,还有其他选择吗?

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

10 个答案:

答案 0 :(得分:13)

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

Is it worth encrypting email addresses in the database?

简而言之,不,不值得加密用户电子邮件地址。您认为数据库泄露可能导致某人也可以访问破解加密所需的密钥,这是正确的。

答案 1 :(得分:12)

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

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

正如你所说,如果他通过你的外围防御,他很可能很容易得到你的解密密钥来解密电子邮件数据。加密可能会略微降低已确定的攻击者的速度,但不会为您的数据添加任何真正的安全性。

最好的方案是散列电子邮件地址(使用salt!)并存储它。这允许您根据输入值检查电子邮件地址(例如)并验证电子邮件地址输入是否与您存储的相同,当然,这样做的主要缺点是您无法知道电子邮件是什么地址没有附加价值,所以如果您想(例如)定期向您的用户发送电子邮件,那么您将会失去运气。

我怀疑你是存储电子邮件地址,因为它是有用的数据,你想要用它做一些事情(比如发送电子邮件:),在这种情况下,加密只会增加工作量这些数据虽然收益很少。

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

答案 2 :(得分:7)

总的来说,我同意其他人说这不值得。但是,我不同意任何可以访问您的数据库的人都可能获得您的密钥。对于SQL注入来说肯定不是这样,对于以某种方式丢失或遗忘的备份副本可能不是这样。我觉得电子邮件地址是个人的细节,所以我不关心垃圾邮件,而是关注地址泄露时的个人后果。

当然,当你害怕SQL注入时,你应该确保禁止注射。备份副本应自行加密。

但是,对于一些在线社区,成员可能绝对不希望其他人知道他们是会员(如与精神保健,经济帮助,医疗和性咨询,成人娱乐,政治等有关)。在这些情况下,尽可能少地存储个人详细信息并加密所需的信息(注意数据库级加密不会阻止细节显示使用SQL注入),可能不是一个坏主意。再次:将电子邮件地址视为个人详细信息。

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

答案 3 :(得分:7)

  

计算机安全中最经常被引用的真理之一是   只有真正安全的计算机才能被埋在混凝土中,具有强大的功能   关闭,网线切断。

考虑到这一点,安全存储电子邮件地址的最佳方法是什么? 根本不要存储它们!

tl; dr 您是否需要他们的电子邮件地址或向他们发送电子邮件的方式?要么信任能比你做得更好的人,要么完全不使用电子邮件地址。

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

  • 帐户确认&认证
  • 交易&营销电子邮件

确认&认证

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

  • 手机
  • 拥有受信任网站(Facebook,Google,Twitter)的帐户

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

对于客户进行身份验证,他们提供的只是他们的手机号码和密码,或者是OpenID身份验证令牌。既不需要电子邮件地址(OpenID提供商也可能,但这不是您的责任)。

如果这些不是一个选项,那么您仍然可以确认一个电子邮件地址,然后将其用于身份验证。确认仅需要存储唯一令牌以及要发送到电子邮件地址的链接。存储电子邮件地址的盐渍哈希值,并使用该哈希值与帐户匹配。

交易&营销电子邮件

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

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

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

答案 4 :(得分:2)

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

加密您的电子邮件地址没有多大意义。除此之外,您不希望收集数据库中的许多其他信息,在您的数据库打开的同时,解密密钥确实可以实现。

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

即使他们在同一台机器上,黑客也可能无法确定您的密码存储位置(尽管我不会依赖它)。

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

当然,如果您使用的是MySQL,那么您别无选择,只能在应用程序级别执行此操作。

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

答案 8 :(得分:1)

加密数据库内容始终是一个棘手的考虑因素。很明显,除非可以不加密,否则内容是无用的,如果必须在没有人为干预的情况下发生,那么你将把密文和密钥存储在某个地方。如果那个某个地方在同一台机器上,那么人们可能会想知道为什么你甚至会烦恼。

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

一般来说,加密数据库内容并不会赢得任何奖项,但如果你能证明这一点,那么你至少有一些动机去做。

答案 9 :(得分:-1)

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