【问题标题】:MySQL Partial Field EncryptionMySQL 部分字段加密
【发布时间】:2016-03-15 07:06:01
【问题描述】:

出于搜索/索引目的,是否有一种简单/干净的方法可以使用 MySQL 进行部分字段加密?

例如,使用诸如AES_ENCRYPT() 之类的内置功能或任何其他等效功能?

例子:

  1. 我想加密所有姓氏字段,不包括前 3 个字符。
  2. 我想加密除最后 4 位之外的所有信用卡号字段。

更糟糕的情况是,我可以创建一个子字符串,然后对所需部分进行加密,然后将数据连接起来。然后我可以做一个类似的解密过程。对于我希望在某个地方构建的东西,这似乎需要做很多工作。

我的谷歌没有得到回报。有谁知道干净利落的方法?

【问题讨论】:

  • 不 - 不干净。仅加密值的“部分”意味着该值不是原子的,因此您的数据库未标准化。可以通过创建一个包含函数的视图,然后禁用对表的直接 SELECT 访问。

标签: mysql encryption indexing aes pci-compliance


【解决方案1】:

在支付卡处理领域,通常为卡号的最后四位数字和代表整个卡号的加密令牌维护单独的列。

数据重复最少。

最后四位数字可能以明文形式保存,以帮助客户了解正在使用的支付卡。用户的姓名、地址和卡的有效期也可以明文存储。

卡验证码(通常显示在卡背面的三位数或四位数代码)在任何情况下绝不在卡通过验证后以任何形式存储.

了解您的数据库中的对称加密(如 AES)对于网络犯罪分子的防御很弱,这一点很重要。它太弱了,几乎没有用。这是因为您的 Web 应用程序软件必须具有随时可用的密钥来加密新信息。许多对在线系统的攻击都是通过 Web 应用程序进行的,因此网络犯罪分子可以轻松获取密钥。然后他就有了你的卡数据。

如果您收集或存储支付卡号(信用卡号),您的企业将受到支付卡行业 (PCI) 数据安全要求的约束。特别是,您最终必须填写这份自我评估问卷https://www.pcisecuritystandards.org/documents/SAQ_A-EP_v3-1.pdf。第一年,这将花费大约 50,000 美元,之后的每一年将花费大约一半。

另一方面,通过像 stripe.com 或 Paypal 这样的支付处理商可以利用他们的 PCI 数据安全要求并减少您的风险。

因此,请三思而后行,是否要收集这些信息,并与您的会计师或首席财务官交谈。

如果您必须存储支付卡信息,您可以考虑使用非对称(公共/私有)加密机制。要安全地执行此操作,请设置一台专用机器,并在该机器上生成一个密钥对(也许是 RSA)。将公钥导出到您的 Web 应用程序,并且不要复制私钥。然后关闭专用机器及其磁盘驱动器,并断开它与网络的连接。(打开它并移除 wifi 和蓝牙适配器卡,然后拔下以太网电缆。)

使用您的 Web 应用程序上的公钥加密卡片并将它们存储在您的数据库中。当您需要使用支付卡号来处理付款或诸如此类的事情时,您可以暂时打开专用机器并使用它来进行处理。

如果您有信用卡号码,您的系统就会成为网络犯罪分子的目标。在您意识到有能力、有积极性和不道德的人实际上正在密谋反对您之前,这一切似乎都是偏执的。

【讨论】:

  • 好极了,奥利。我将此问题添加为书签只是为了您的回答。
  • @OllieJones,我喜欢这个答案。不过,我确实对您所说的某些事情感到担忧……您提到考虑公共/私有机制。这种非对称方法不会与对称方法具有相同的风险吗?例如。如果作为一名黑客,我使用公钥加密可能的信用卡值的每个排列,然后将这些值与存储在数据库中的值进行比较,那么我可以在数据库中找到匹配项并推断出纯文本。合法的关注?如果有,我们该如何处理?
  • @OllieJones,我将上述评论发布到它自己的问题中,因为它似乎超出了原始问题的范围:stackoverflow.com/questions/36015610/…
猜你喜欢
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2017-12-20
  • 2012-08-31
相关资源
最近更新 更多