如何用弹性城堡加密数据,同时确保结果是确定性的

时间:2019-03-28 16:14:07

标签: java scala encryption bouncycastle

问题

我们想对个人身份信息进行加密。它们不可读。但是,由于结果也将用于机器学习,因此每次对值(例如“ ABC”)进行加密时,结果数据都应该相同。

大多数加密密码都包含initialization vector。这违背了我们的需要。需要明确的是,数据应该是加密的,但这并不需要是防弹的。数据永远不会传输到组织外部,只需遵守GDPR即可。

上下文

我们决定使用bouncy castle,因为它支持多种加密模式,包括(显然是快速ECC)。由于我们正在谈论每天加密几个TB,因此拥有良好的性能将是一件很不错的事情。

解决方案问题

尽管充气城堡库编写得不错,但似乎很难在上面找到好的文档和用法示例。我正在努力寻找我的切入点。我是否必须查看org.bouncycastle.cryptoorg.bouncycastle.crypto.engines软件包?还是crypto.ec?我找到了ZeroBytePadding类,我相信它应该为我提供一个可能的引擎,该引擎可以满足我的需求,但找不到我想要的东西。

目标

具有一组与此类似的方法的类:

class Anonomyzer{
  def initialize(publicKey: String, privateKey: String): Unit
  def encode(data: Array[Byte]): Array[Byte]
  def decode(data: Array[Byte]): Array[Byte]
}

以下代码应为真

Anonomyzer.initialize("PUBLIC", "PRIVATE")
val once = Anonomyzer.encode(data)
val twice = Anonomyzer.encode(data)
Arrays.equals(once, twice)

编辑: 我已经阅读了更多有关此内容的内容,发现我所寻找的被称为 Electronic Codebook操作模式。尽管这并不是绝对安全,但这是我们对AFAIK所希望的最好。

1 个答案:

答案 0 :(得分:1)

  

但是,由于结果也将用于机器学习,因此每次对值(例如“ ABC”)进行加密时,结果数据都应该相同

您可能有更多选择。在需要加密的地方正确加密数据是更加安全的。您可能出于不同的目的而拥有不同的数据集。

只是建议:

  • 您可以匿名化学习数据集,剥离其PII的数据并将其聚合到合理的水平,这对于ML仍然有价值。我更喜欢此选项,因为这样可以很干净,而又不会冒任何违反规则或泄露受保护信息的风险
  • 您可以对PII(或分类数据)进行哈希处理,这将提供唯一的映射而没有可逆的映射(尽管总会有原始值的映射)
  • 对于定量数据,您可以搜索“订单保留加密”,而这可能并非易事,这是我选择第一种选择的原因之一。

在某些情况下,使用快捷方式(使用ECB或静态IV)可能会完全破坏加密数据的安全性。因此,在您真正知道自己在做什么之前,您可能会用自己的腿开枪

  

我们决定使用弹性城堡,因为它支持多种加密模式,包括(显然是快速ECC)

我会说-您不需要BC库。这是一个写得很好的库,但是就您而言,我认为它没有任何特定的需求。

  

显然是快速ECC)。既然我们正在谈论每天加密几个TB,那么拥有良好的性能会很好

ECC仍然是非对称加密,通常用于混合加密(对对称数据加密密钥进行加密)。因此,如果您追求速度,可以使用JVM和VM来确保本机AES-NI支持或使用一些快速密码(salsa,..)。如果正确完成,加密通常不是性能瓶颈

  

我正在努力寻找入口点。

在大多数情况下,您可以将默认的Java crypto API与指定的提供程序一起使用

Security.addProvider(new BouncyCastleProvider());
... 
 Cipher cipher = Cipher.getInstance("AES/OFB/NoPadding", "BC");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");

编辑:固定的填充组合