Security 确保从内存clojure中删除对象
我使用AES来加密一些东西,通过从Clojure调用java加密库。作为其中的一部分,我将生成一个用于加密的新密钥(在我的例子中,是来自Amazon KMS的“DataKey”)。Amazon建议在使用数据密钥后立即将其从内存中删除 作为一个代码示例,Security 确保从内存clojure中删除对象,security,encryption,clojure,jvm,aws-kms,Security,Encryption,Clojure,Jvm,Aws Kms,我使用AES来加密一些东西,通过从Clojure调用java加密库。作为其中的一部分,我将生成一个用于加密的新密钥(在我的例子中,是来自Amazon KMS的“DataKey”)。Amazon建议在使用数据密钥后立即将其从内存中删除 作为一个代码示例,kms-generated-key是我在点击generatedtakey端点()时从kms-api(通过aws-api库)得到的响应。它包含我想要加密的新数据密钥的明文和加密版本 然后我有一个本地加密函数,它接受该散列并返回一个新的散列,包括加密密
kms-generated-key
是我在点击generatedtakey
端点()时从kms-api(通过aws-api库)得到的响应。它包含我想要加密的新数据密钥的明文和加密版本
然后我有一个本地加密函数,它接受该散列并返回一个新的散列,包括加密密文和加密数据密钥。我会把这两个都保存起来,以备日后使用
如何确保已从内存中删除明文密钥
(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运行时中寻找任何通用的东西 我可以考虑在使用后覆盖纯文本键的情况。但在这些情况下,我不会通过一些任意接口以简单的方式交付密钥 您刚刚从一个服务接收到纯文本的密钥,并且在接收它之前,您无法知道它经过了什么类型的缓冲区和不可变的字符串对象。要真正将其从内存中删除,您需要访问所有这些缓冲区和字符串对象,并确保它们被清除,等等
完全从内存中删除这些值对于它们所呈现的设计来说是一个失败的原因 好吧,没有办法保证这一点。您可以使其符合垃圾收集的条件,并调用
System/gc
轻松建议进行垃圾收集,但您不能明确地将其从内存中删除/“清除”。高度相关:@Carcigenicate谢谢!我避免明确提到JavaGC,因为我认为这里的要点是确保变量符合垃圾收集的条件,或者我需要做一些技巧来直接分配内存。不过我要添加JVM标记。哦,那么你只是想确保它有资格被删除,而不是它实际上立即被删除?@Carcigenicate我对我的任何选项都感兴趣。我可以想象(但我相信这并不是详尽无遗的)任何事情,从1)确保在下一次GC运行时删除它(这里只是从范围中删除变量就足够了,还是clojure妨碍了?),2)确保删除它,然后强制GC运行,或者3)一些不安全的技巧来直接管理内存,就像我在CIf中所做的那样,如果您有一个可变的数据结构,您可以在释放变量以进行GC'd之前用全零覆盖。使用BufferedInputStream
,您最多只能在释放它之前调用close()
。除此之外,要清理未使用的/不需要的对象(如字符串
),您还得听命于Java GC系统。