gpt4 book ai didi

haskell - 在 Haskell Web 应用程序中管理加密随机数生成器

转载 作者:行者123 更新时间:2023-12-02 13:11:37 24 4
gpt4 key购买 nike

我正在编写一个应用程序,我希望能够通过 Web API 向客户端提供 RSA 加密 token 。

我正在使用crypto-pubkey library对于 RSA,例如:

encrypt :: CPRG g
=> g -- ^ random number generator.
-> OAEPParams -- ^ OAEP params to use for encryption.
-> PublicKey -- ^ Public key.
-> ByteString -- ^ Message to encrypt
-> (Either Error ByteString, g)

在我的例子中,消息是用于加密 token 的 AES 内容 key 。我可以创建一个CPRG使用提供 AES 计数器模式实现的 cprng-aes 库的实例:

makeSystem :: IO AESRNG

这与 Yesod 在其 ClientSession 模块中使用的实现相同。我查看了它,它在 IORef 后面存储了一个全局实例,并使用它来实现一个在 atomicModifyIORef 调用中生成初始化向量的函数。

这是可以的,因为该函数只是从生成器中取出一些字节并返回它们,将新的 CPRG 实例写回 IORef。然而,RSA API 需要直接传递一个 CPRG 实例,即使我可以在调用atomicModifyIORef 中执行 token 生成,它也可能会更加复杂。操作成本高昂并导致争用问题。

我的一个想法是在调用加密 API 之前提前从全局实例中提取足够的数据,并将其包装在由 ByteString 支持的 CPRG 实例中>,但这有点脆弱,因为它需要事先了解 token 生成过程的内部结构 - 内容 key 大小、RSA 填充等,这些知识可能会根据所选参数的不同而有所不同。

当纯函数(如上述 RSA API)用于多线程客户端-服务器应用程序时,管理纯函数所需的随机数生成器的最佳选项是什么?

最佳答案

我建议使用 CPRG 实例池,如果数字表明您需要它。可能值得首先进行一些基本分析,看看简单的atomicModifyIORef 方法是否会成为瓶颈。

对于池,您可以使用 http://hackage.haskell.org/package/resource-pool ,或http://hackage.haskell.org/package/pool-conduit (基于资源池)。

关于haskell - 在 Haskell Web 应用程序中管理加密随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024461/

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