【问题标题】:Haskell & Scrypt: How to get the encrypted hashHaskell & Scrypt:如何获取加密哈希
【发布时间】:2016-10-17 21:58:40
【问题描述】:

*抱歉这个基本问题,刚开始学习 Haskell。

我正在尝试编写一个函数来获取一个字符串并返回一个加密的哈希值。

我暂时想到的是:

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(不使用最黑暗的魔法,或者通过调用另一个库方法)。相反,修正你的类型:ByteString -&gt; IO ByteString
  • 哦...好的。那么如何将值保存到数据库中呢? IE。再往下,我有 execute "INSERT INTO test VALUES ... 我想使用加密值。
  • 如果后面还有一个IO 操作,只需将它们都放在do 表达式中。
  • 我明白了。谢谢!!

标签: haskell scrypt io-monad


【解决方案1】:

您需要调整encrypt 以返回IO ByteString,而不是删除IOencryptPassIO' 需要随机数据用于盐,它从 IO monad 获得,所以你被困在那里。

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

我使用encryptPassIO' . Pass 从参数中获取IO EncryptedPass 值,而不是do 表示法。然后我们使用fmapgetEncryptedPass :: EncryptedPass -&gt; ByteString 提升到IO monad。

您可以使用 do 表示法,但 IMO fmap 使这个更干净:

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

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2010-12-19
    • 2015-06-28
    • 2013-03-04
    相关资源
    最近更新 更多