security - 确保从内存clojure中删除对象
问题描述
我正在使用 AES 来加密某些东西,方法是从 Clojure 调用 java 加密库。作为其中的一部分,我正在生成一个用于加密的新密钥(在我的例子中是来自亚马逊 KMS 的“DataKey”)。Amazon 建议在使用数据密钥后立即从内存中删除它。
作为一个代码示例,当我点击端点(https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)kms-generated-key
时,我从 KMS api(通过 aws-api 库)得到的响应是. 它包含我要加密的新数据密钥的明文和加密版本。GenerateDataKey
然后我有我的本地加密函数,它接受该哈希并返回一个新的哈希,包括加密的密文和加密的数据密钥。我会存储这两个以备后用。
如何确保明文密钥已从内存中清除?
(defn kms-generated-key
[]
; ... leaving out AWS API request code, but it gives this...
{:CiphertextBlob "...", ; java.io.BufferedInputStream - this is an encrypted version of the new data key
:Plaintext "...", ; java.io.BufferedInputStream - this is the plaintext version of the new data key
:KeyId "arn:aws:..."})
(defn encrypt
[secret-text]
(let [{data-key :Plaintext
encrypted-data-key :CiphertextBlob} kms-generated-key]
{:ciphertext (encrypt-locally-using-data-key data-key secret-text)
:encrypted-data-key encrypted-data-key}))
编辑:我只需要在 JVM 上运行的 clojure 中执行此操作,我不会在 clojurescript / CLR 运行时中寻找任何通用的东西。
解决方案
我可以想到我想在使用后覆盖纯文本密钥的情况。但在那些情况下,我不会通过一些任意接口直接传递密钥。
您刚刚从服务中收到纯文本的密钥,并且您无法知道在收到它之前它已经通过了什么样的缓冲区和不可变字符串对象。要真正从内存中删除它,您需要访问所有这些缓冲区和 String 对象并确保它们被清除等。
完全从内存中删除值是他们提出的设计的失败原因。
推荐阅读
- model-view-controller - Redirect in MVC controller to another controller not working
- visual-studio-code - 如何在 VS Code 中运行 Lua 脚本
- ruby-on-rails - Edgeguides 的 Rails 入门模板缺失错误
- ruby - 如何在多个配置文件中包含自定义检查资源?
- python - 雪碧没有出现在pygame窗口上
- python - 如何在使用 Python 和 Redis 以管理员身份登录时创建注销用户的函数
- javascript - 将 jQuery 转换为 JavaScript 以进行 Google Analytics pdf 下载跟踪
- asp.net-core - 使用 EntityFrameworkCore 向 ASP.NET Core 项目添加标识时出现问题
- python - 如何在 Django 中使用 Hardcopy 在所选目录中创建 pdf 输出文件?
- apache - 如何从请求体内部发送巨大的 JSON?测量仪