gpt4 book ai didi

haskell - Haskell 或 OCAML 能否在不通过垃圾收集泄漏的情况下处理敏感数据?

转载 作者:行者123 更新时间:2023-12-02 01:30:41 25 4
gpt4 key购买 nike

我会做这样的事情(伪代码):

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)

敏感数据在内存中的简单(未加密)时间应该尽可能短。

不得以任何方式泄露纯数据。

A. 这样的程序可以用 Haskell 或 OCAML 编写吗?

B. 是否可以防止
数据被泄露,即被默默地复制到
垃圾收集器的背景?

C. 普通数据能否正确
在内存中被覆盖?

据我所知,垃圾收集器 (GC) 可以在后台默默地复制数据。我猜这是由分代 GC 算法完成的,但我不确定。

我知道如果攻击者设法在正确的时间/状态下获得程序的内存,攻击者仍然有可能获得纯数据。我只是考虑这样做以提高安全性,因为我没有控制上下文(即操作系统、交换等)。

最佳答案

我已经在评论中提到了这一点,但我认为这是一个非常好的问题,值得回答。

已有数据类型 ScrubbedBytes 具有以下属性:

  • 它分配有 newAlignedPinnedByteArray# ,这意味着新分配的 MutableByteArray#在你的代码中的任何地方被引用它不会被 GCed,但它也不会被移动或复制。
  • 在分配时,会使用 mkWeak# 创建弱指针并且终结器被添加到新分配的内存中。这意味着每当您的代码中不再引用已清理的字节时,并且在 GC 释放内存之前,将调用一个清理器,将零写入内存。
  • 相等不会短路,从而防范定时攻击。

  • 这个洗涤器有一个小问题。它不会被执行的可能性很小,特别是如果程序在 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 运行。

    关于haskell - Haskell 或 OCAML 能否在不通过垃圾收集泄漏的情况下处理敏感数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62148679/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com