问题
我们想对个人身份信息进行加密。它们不可读。但是,由于结果也将用于机器学习,因此每次对值(例如“ ABC”)进行加密时,结果数据都应该相同。
大多数加密密码都包含initialization vector。这违背了我们的需要。需要明确的是,数据应该是加密的,但这并不需要是防弹的。数据永远不会传输到组织外部,只需遵守GDPR即可。
上下文
我们决定使用bouncy castle,因为它支持多种加密模式,包括(显然是快速ECC)。由于我们正在谈论每天加密几个TB,因此拥有良好的性能将是一件很不错的事情。
解决方案问题
尽管充气城堡库编写得不错,但似乎很难在上面找到好的文档和用法示例。我正在努力寻找我的切入点。我是否必须查看org.bouncycastle.crypto
或org.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所希望的最好。
答案 0 :(得分:1)
但是,由于结果也将用于机器学习,因此每次对值(例如“ ABC”)进行加密时,结果数据都应该相同
您可能有更多选择。在需要加密的地方正确加密数据是更加安全的。您可能出于不同的目的而拥有不同的数据集。
只是建议:
在某些情况下,使用快捷方式(使用ECB或静态IV)可能会完全破坏加密数据的安全性。因此,在您真正知道自己在做什么之前,您可能会用自己的腿开枪
我们决定使用弹性城堡,因为它支持多种加密模式,包括(显然是快速ECC)
我会说-您不需要BC库。这是一个写得很好的库,但是就您而言,我认为它没有任何特定的需求。
ECC仍然是非对称加密,通常用于混合加密(对对称数据加密密钥进行加密)。因此,如果您追求速度,可以使用JVM和VM来确保本机AES-NI支持或使用一些快速密码(salsa,..)。如果正确完成,加密通常不是性能瓶颈显然是快速ECC)。既然我们正在谈论每天加密几个TB,那么拥有良好的性能会很好
我正在努力寻找入口点。
在大多数情况下,您可以将默认的Java crypto API与指定的提供程序一起使用
Security.addProvider(new BouncyCastleProvider());
...
Cipher cipher = Cipher.getInstance("AES/OFB/NoPadding", "BC");
或
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
编辑:固定的填充组合