3

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

我正在使用RSAcrypto-pubkey,例如:

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)

就我而言,消息是用于加密令牌的 AES 内容密钥。我可以使用提供 AES 计数器模式实现CPRG的库创建一个实例:cprng-aes

makeSystem :: IO AESRNG

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

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

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

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

4

1 回答 1

1

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

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

于 2013-04-16T06:33:40.143 回答