Haskell & Scrypt:如何获取加密后的哈希值

Haskell & Scrypt: How to get the encrypted hash

*基础问题不好意思,刚开始学习Haskell。

我正在尝试编写一个函数来获取一个字符串和 return 一个加密的散列。

我暂时想到的是:

encrypt :: ByteString -> ByteString
encrypt = do
    x <- Crypto.Scrypt.encryptPassIO' (Pass "secret")
    fmap Crypto.Scrypt.getEncryptedPass x

但是我得到了错误:

• Couldn't match expected type ‘ByteString’
              with actual type ‘IO ByteString’
• In a stmt of a 'do' block: x <- encryptPassIO' (Pass plain)
  In the expression:
    do { x <- encryptPassIO' (Pass plain);
         fmap Crypto.Scrypt.getEncryptedPass x }
  In an equation for ‘encrypt’:
      encrypt plain
        = do { x <- encryptPassIO' (Pass plain);
               fmap Crypto.Scrypt.getEncryptedPass x }

知道如何摆脱 IO 吗?

谢谢!

与其摆脱 IO,不如将 encrypt 调整为 return 和 IO ByteStringencryptPassIO' 需要随机数据用于盐,它从 IO monad 获取,所以你被困在那里。

import Crypto.Scrypt (encryptPassIO', getEncryptedPass)
encrypt :: ByteString -> IO ByteString
encrypt = fmap getEncryptedPass . encryptPassIO' . Pass

而不是 do 符号,我使用 encryptPassIO' . Pass 从参数中获取 IO EncryptedPass 值。然后我们使用 fmapgetEncryptedPass :: EncryptedPass -> ByteString 提升到 IO monad。

您可以使用 do 表示法,但 IMO fmap 使此更清晰:

encrypt pass = do
    x <- encryptPassIO' pass
    return (getEncryptedPass x)