如何在haskell中正确生成随机字节串

Fab*_*hau 10 random haskell cryptography

我是haskell的新手,想写一个函数来生成随机字节串.从我的角度来看Crypto.Random(来自crypto-api v0.3.1)似乎是最好的模块,但我无法弄清楚.

我想做类似以下的事情:

let size = 2048
let bytestring = randomByteString size
Run Code Online (Sandbox Code Playgroud)

Tho*_*son 8

  1. 您可以使用CryptoRandomGenGanesh显示的任何实例
  2. 您可以使用System.Random非安全随机值(请参阅jamshidh的答案)
  3. 您可以只获得平台底层生成器提供的熵(这就是幕后SystemRandom的内容).

选项3:从您的平台获取熵

最后一种技术是最简单的,但在没有RDRAND指令的系统上有更高的开销 - 它必须打开文件,读取和关闭文件.这是使用entropy包:

import System.Entropy

someFunc = do
    randBytes <- getEntropy 2048
    ....
Run Code Online (Sandbox Code Playgroud)

选项1:使用CryptoRandomGen实例

如果你想要一个纯粹的生成器但是用高熵种子播种,那么你可以使用包中的任何CryptoRandomGen实例化值DRBG:

import Crypto.Random.DRBG
Run Code Online (Sandbox Code Playgroud)

然后就是Ganesh的例子(这里转载),其中有一个不同的签名newGenIO:

do
  g <- newGenIO :: IO CtrDRBG
  case genBytes size g of
    Left err -> error $ show err
    Right (result, g2) -> return result
Run Code Online (Sandbox Code Playgroud)

对于好奇,我在我的博客上回顾了一些可用的安全RNG - 其中大多数不符合任何标准(这不好,它们似乎完全脱离程序员的袖口发明),例外的RDRAND,HashDRBGHmacDRBG.


GS *_*ica 5

您需要在IOmonad中执行此操作以初始化生成器的熵.像这个片段这样的东西可以用来做一个简单的例子,虽然在更复杂的代码中你应该保留生成器g2并稍后重新使用它.

do
    g <- newGenIO :: IO SystemRandom
    case genBytes size of
        Left err -> error $ show err
        Right (result, g2) -> return result
Run Code Online (Sandbox Code Playgroud)