如果我有一个有效载荷,签名和一个公共密钥(全部为字节串或类似格式),如何验证签名?
我在Hackage上看到的所有PublicKey
类型似乎纯粹是通过数字表示密钥,例如:
PublicKey
public_size :: Int -- size of key in bytes
public_n :: Integer -- public p*q
public_e :: Integer -- public exponant e
如何从PEM文件中获取PublicKey
,或者直接从PEM文件中进行验证?
[从反馈中进行编辑,未尝试进行任何解决方案]-我四处寻找解决方案,但是根本找不到满足我期望的任何类型签名的东西,例如{{1} }。我不想从头开始重新实现它,因为我现在正在做的只是调用执行所有验证的python脚本。如果我不需要调出python,但似乎找不到任何现有代码,那就太好了。
答案 0 :(得分:1)
如果库公开了类似public_n :: Integer
的接口,则意味着它是说明RSA操作的库,而不是用于加密的库。加密库具有类似sign :: Key -> ByteString -> ByteString
的接口。任何加密库都应能够解析PEM格式的密钥。
OpenSSL是流行的密码学库。它并不总是理想或易于使用,但它已经广泛使用,并且由于使用Haskell,因此您不会使用其古怪的C接口。因此,您可以使用HsOpenSSL
,它是基于OpenSSL的Haskell绑定。 (注意:我从未使用过HsOpenSSL,但是看起来很明智。)使用OpenSSL.PEM.readPrivateKey
读取PEM格式的密钥,使用OpenSSL.EVP.Digest.digestLBS
计算要签名的消息的摘要,然后使用{{3 }}对摘要进行签名。