如何在haskell中正确生成随机bytestring
我是haskell的新手,想编写一个函数来生成随机字节字符串。 从我的角度来看,From似乎是最好的模块,但我想不出来 我想做如下工作:如何在haskell中正确生成随机bytestring,haskell,random,cryptography,Haskell,Random,Cryptography,我是haskell的新手,想编写一个函数来生成随机字节字符串。 从我的角度来看,From似乎是最好的模块,但我想不出来 我想做如下工作: let size = 2048 let bytestring = randomByteString size 您需要在IOmonad中执行此操作,以初始化生成器的熵。对于一个简单的示例,类似于此片段的内容就可以了,不过在更复杂的代码中,您可能应该保留生成器g2,以后再使用它 do g <- newGenIO :: IO SystemRandom
let size = 2048
let bytestring = randomByteString size
您需要在
IO
monad中执行此操作,以初始化生成器的熵。对于一个简单的示例,类似于此片段的内容就可以了,不过在更复杂的代码中,您可能应该保留生成器g2
,以后再使用它
do
g <- newGenIO :: IO SystemRandom
case genBytes size of
Left err -> error $ show err
Right (result, g2) -> return result
do
g错误$show err
右(结果,g2)->返回结果
这里有很多部分,所以我将在下面描述这些部分是如何工作的。。。。但现在,这里是代码
import Data.ByteString
import Data.Word8
import System.Random
randomBytes::Int->StdGen->[Word8]
randomBytes 0 _ = []
randomBytes count g = fromIntegral value:randomBytes (count - 1) nextG
where (value, nextG) = next g
randomByteString::Int->StdGen->ByteString
randomByteString count g = pack $ randomBytes count g
main = do
g <- getStdGen
let bytestring = randomByteString 2048 g
print bytestring
import Data.ByteString
导入数据.Word8
导入系统。随机
随机字节::Int->StdGen->[Word8]
随机字节0
randomBytes count g=fromIntegral值:randomBytes(计数-1)nextG
其中(值,nextG)=下一个g
randomByteString::Int->StdGen->ByteString
randomByteString计数g=pack$randomBytes计数g
main=do
G
您可以使用CryptoRandomGen
的任何实例,如Ganesh所示
对于非安全随机值,可以使用System.Random
(参见jamshidh的答案)
您只需获取平台底层生成器提供的熵(这就是SystemRandom
在封面下所做的)
选项3:从平台获取熵
最后一种技术是最简单的,但是在没有RDRAND指令的系统上有更高的开销——它必须打开文件、读取和关闭文件。这是使用熵
包:
import System.Entropy
someFunc = do
randBytes <- getEntropy 2048
....
import Crypto.Random.DRBG
然后就是Ganesh的例子(在这里复制),在newGenIO上有一个不同的签名:
do
g <- newGenIO :: IO CtrDRBG
case genBytes size g of
Left err -> error $ show err
Right (result, g2) -> return result
do
g错误$show err
右(结果,g2)->返回结果
出于好奇,我-除了RDRAND
、HashDRBG
和HmacDRBG
之外,它们中的大多数都不符合任何标准(这是不好的,它们似乎完全是程序员的即兴发明)
由于他正在研究crypto api,我认为他需要更好的随机性,而不是一次性使用,直接使用系统不会出现性能瓶颈。熵模块更干净,可能更不容易出错(参见我的答案)。但是我同意你的看法,在部署的设置中持续使用RNG加上一些monad-likeMonadCryptoRandom
是一个很好的功能解决方案。我使用选项3,因为它正是我想要的功能,我不介意开销,因为我将生成千兆字节的数据,并且根据包的描述,它应该具有很强的加密能力。思考!cryptonite包有一个Crypto.Random模块,其中还有一个getRandomBytes