代码之家  ›  专栏  ›  技术社区  ›  User

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

  •  20
  • User  · 技术社区  · 16 年前

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

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

    知道解密密钥将在数据库附近的某个地方,加密电子邮件是否有意义?我想如果有人进入这个系统,他们也会找到钥匙,如果不是马上就找到了。

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

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

    10 回复  |  直到 8 年前
        1
  •  12
  •   CraigTP    16 年前

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

    当然,您可以对它们进行加密,但在本例中,这是通过模糊来有效地实现安全性的。基本上,如果应用程序的外围是安全的,那么其中的数据可以是纯文本。在这里加密增加了处理数据的复杂性,但并不能真正阻止攻击者获取原始数据。

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

    最好的方案是散列电子邮件地址(用salt!)然后储存起来。这允许您根据输入值检查电子邮件地址(例如),并验证输入的电子邮件地址是否与您存储的相同,当然,这样做的主要缺点是,如果没有该附加值,您无法知道电子邮件地址是什么,因此,如果您希望(例如)定期向用户发送电子邮件,您将运气不好。

    我怀疑你在存储电子邮件地址,因为它是有用的数据,而你 想用它做点什么(比如发送电子邮件:)在这种情况下,加密只会增加处理数据的开销,而获得的回报却很少。

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

        2
  •  13
  •   Community CDub    7 年前

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

    Is it worth encrypting email addresses in the database?

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

        3
  •  7
  •   Arjan    16 年前

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

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

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

    对于你的娱乐网站来说,可能不是这样,你应该把重点放在禁止 SELECT * FROM 通过SQL注入,并确保访问者无法通过更改URL以某种方式获取其他人的个人配置文件或订单信息。

        4
  •  7
  •   roo    11 年前

    在计算机安全中最常被引用的真理之一是 只有一台真正安全的计算机是埋在混凝土里的 关闭并切断网络电缆。

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

    DR 你需要他们的电子邮件地址,还是发送电子邮件的方式?要么信任一个比你做得更好的人,要么根本不使用电子邮件地址。

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

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

    确认和验证

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

    • 移动电话
    • 拥有可信网站(Facebook、Google、Twitter)的帐户

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

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

    如果这些不是一个选项,那么您仍然可以确认电子邮件地址,然后使用它进行身份验证。确认只需要存储唯一的令牌和发送到电子邮件地址的链接。存储一个电子邮件地址的salted散列,并使用它来与我们使用密码的方式匹配帐户。

    交易和营销电子邮件

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

    如果你想使用电子邮件,那么使用电子邮件平台,比如 Mandrill MailChimp . 当他们注册后,在mailchimp的邮件列表中创建一个订户。使用帐户存储订阅服务器ID。对于事务电子邮件(重置密码、帐户更新),获取订户并将存储的电子邮件传递给mandrill以发送电子邮件。对于大众营销,只需发送到mailchimp的邮件列表。

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

        5
  •  2
  •   Peter Smit    16 年前

    我认为,当人们进入你的数据库时,你就完蛋了。)

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

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

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

        6
  •  1
  •   soulmerge    16 年前

    取决于访问地址的频率。如果你偶尔读一次,可能会有意义,但这将是我最后一次花时间关注的安全问题。

        7
  •  1
  •   MaxVT    16 年前

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

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

        8
  •  1
  •   James Davies    16 年前

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

    即使他们在同一台机器上,黑客也可能不知道你的密码存储在哪里(尽管我不相信)。

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

    当然,如果你使用的是MySQL,那么你别无选择,只能在应用程序级别上使用它。

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

        9
  •  1
  •   tylerl    16 年前

    加密数据库内容总是一个棘手的问题。显然,除非内容可以不加密,否则它是无用的,如果必须在没有人为干预的情况下进行,那么您将把密码文本和密钥存储在某个地方。如果 在某处 是在同一台机器上,那么人们可能会想你为什么会这么麻烦。

    好吧,你想这么做有几个原因。一是因为你 必修的 因为公司的一些政策。另一个原因是,与访问数据库的机器相比,您的数据库所处的环境可能更恶劣。

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

        10
  •  0
  •   Jun Dela Cruz    8 年前

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