我会这样做(伪代码):
1. load sensitive encrypted data from file
2. decrypt the data
3. do something with the unencrypted data
4. override the data safely / securely (for example with random data)敏感数据以明文(未加密)存储在内存中的时间应尽可能短。
不能以任何方式泄露普通数据。
答:这样的程序可以用Haskell或OCAML编写吗?
B.是否可以防止数据泄露,即通过垃圾收集器在后台默默复制数据?
C.普通数据可以在内存中被正确覆盖吗?
据我所知,垃圾收集器(GC)可以在后台静默地复制数据。我猜这是由分代GC算法完成的,但我不确定。
我知道,如果攻击者设法在正确的时间/状态获得程序的内存,那么攻击者仍然有可能获得普通数据。我只是考虑这样做以提高安全性,因为我没有上下文(即操作系统、交换等)。在控制之下。
发布于 2020-06-03 00:12:02
我已经在评论中提到了这一点,但我认为这是一个非常好的问题,值得一个答案。
已存在具有以下属性的数据类型ScrubbedBytes:
newAlignedPinnedByteArray#分配的,这意味着当新分配的MutableByteArray#在代码中的任何地方被引用时,它不会是GCed,但它也不会被移动或复制。mkWeak#创建弱指针,并将终结器添加到新分配的内存中。这意味着,只要在代码中不再引用清理过的字节,并且在GC释放内存之前,将调用一个将向memory.这个洗涤器有一个小问题。它有很小的可能不会被执行,特别是如果程序在GC应该清理内存之前退出。(See more info on weak pointers.)因此,我建议使用bracket模式来实现它。以下是如何使用primitive包完成此操作:
import Control.Exception
import Control.Monad.Primitive (RealWorld)
import qualified Data.Primitive.ByteArray as BA
withScrubbedMutableByteArray ::
Int -- ^ Number of bytes
-> (BA.MutableByteArray RealWorld -> IO a)
-- ^ Action to execute
-> IO a
withScrubbedMutableByteArray c f = do
mba <- BA.newPinnedByteArray c
f mba `finally` BA.setByteArray mba 0 c (0 :: Word8)使用finally更安全的原因是您将有更强的保证内存将被清零。例如,用户在正确的设置中按下Ctrl-C将不会阻止scrubber运行。
发布于 2020-06-05 05:30:11
在OCaml中,可以使用不受GC控制、从不复制、也不受GC检查的Bigarray轻松完成此任务。您可以使用Unix.map_file加载它,使用ocaml-struct很好地处理加载的数据(如果它是结构化的)。OCaml被广泛用于编写低级安全相关代码,请参阅mirage项目(它有大量与密码相关的库)、ocaml-tls ( OCaml中的纯TLS协议实现)和使用OCaml作为目标语言的Project Everest。
在解密/加密和以其他方式处理机密数据时,您应该小心,不要将其放入盒装类型,包括字符串和int64整数。如果你关注一下mirage-crypto,你会发现所有的算法都是使用整数来实现的,整数被表示为即时数,并且从来不会被GC触及。
https://stackoverflow.com/questions/62148679
复制相似问题