首页 > 解决方案 > 确保从内存clojure中删除对象

问题描述

我正在使用 AES 来加密某些东西,方法是从 Clojure 调用 java 加密库。作为其中的一部分,我正在生成一个用于加密的新密钥(在我的例子中是来自亚马逊 KMS 的“DataKey”)。Amazon 建议在使用数据密钥后立即从内存中删除它。

作为一个代码示例,当我点击端点(https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.htmlkms-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 运行时中寻找任何通用的东西。

标签: securityencryptionclojurejvmaws-kms

解决方案


我可以想到我想在使用后覆盖纯文本密钥的情况。但在那些情况下,我不会通过一些任意接口直接传递密钥。

您刚刚从服务中收到纯文本的密钥,并且您无法知道在收到它之前它已经通过了什么样的缓冲区和不可变字符串对象。要真正从内存中删除它,您需要访问所有这些缓冲区和 String 对象并确保它们被清除等。

完全从内存中删除值是他们提出的设计的失败原因。


推荐阅读