我有一个JSON数组:
JsonArray people;它包含表示人的JSON对象。
目前,我正在将它们保存为json文件中的明文。
try {
OutputStream out = new FileOutputStream('storage.json');
JsonWriter writer = Json.createWriter(out);
writer.writeArray(people);
writer.close();
} 但是,我希望对这些文件进行加密,使它们在没有密钥的情况下毫无价值。
做这件事最好的方法是什么?我是应该加密JSON数组对象,还是可以在编写它之前对整个数组进行加密?我应该使用的最推荐的Java密码函数是什么?
发布于 2015-12-29 02:58:49
有很多方法可以做到这一点。
我将在整个文件级别加密JSON,而不是对其中的内容进行加密。另一种选择是复杂的,没有任何有意义的安全优势。我建议使用AEAD密码(我目前的建议是AES-256与GCM:又名AES/GCM/NoPadding,包含256位密钥)。要使用GCM,您需要使用Java 8或更高版本。要将AES-256与Oracle一起使用,您需要按文档的方式安装Java(密码扩展)无限强管辖权策略文件。
您应该确保将身份验证标记设置为包含有关位置和使用的信息(真正的文件名是一个良好的开端),以使重命名或替换其他版本(一种形式的at-rest重放攻击)变得困难。
然而,加密JSON内容并不是一个完整的解决方案。它只是移动了一点球。如果攻击者仍然拥有对私钥的明文访问,那么它将无效。
要保护私钥明文,可以在单独的系统上使用KMS (密钥管理服务)。使用加密的JSON文件将私钥排除在机器上的内存访问之外。您将加密的文件内容提交给加载时要解密的KMS,或者在存储时向KMS提交加密的文件内容。
有了这些功能,您就可以有效地保护文件免受离线攻击(例如:磁盘映像分析、机器映像分析、备份盗窃、媒体盗窃)。如果没有进一步的防御措施,文件的内容仍然会受到机器本身内存的在线攻击。
发布于 2015-12-29 20:13:45
最好对整个文件进行加密,然后按常规方式写入文件。读书也一样。下面是一个关于堆栈溢出的示例。
https://stackoverflow.com/questions/5632658/how-to-encrypt-or-decrypt-a-file-in-java
https://security.stackexchange.com/questions/107528
复制相似问题