MySQL 部分字段加密

MySQL Partial Field Encryption

出于 searching/indexing 目的,是否有 easy/clean 方法使用 MySQL 进行部分字段加密?

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

示例:

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

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

我的谷歌没有得到回报。有谁知道干净地做到这一点的方法吗?

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

数据重复最少。

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

卡验证码(通常显示在卡背面的三位或四位数字代码)必须绝不能在任何情况下,以任何形式存储一旦卡被验证。

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

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

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

所以请三思是否要收集这些信息,并与您的会计师或首席财务官谈谈。

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

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

如果您有信用卡号,您的系统就会成为网络罪犯的诱人目标。这一切可能看起来很偏执,直到您意识到有能力、有上进心和不择手段的人实际上正在密谋反对您。