我正在编写一个应用程序,我希望能够通过 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)所需的随机数生成器时,管理它们的最佳选择是什么?