我正在尝试使用Linux上的openssl
命令行程序获取文件的AES HMAC。我一直在查看手册页,但无法弄清楚如何成功制作HMAC。我可以使用带有enc
的{{1}}命令加密文件,但我似乎无法创建HMAC。加密如下所示:
openssl
任何建议或教程都会很精彩
答案 0 :(得分:9)
您可能会问CBC-MAC。为此,我认为您只需使用IV为0加密消息或文件,然后取最后一个块(AES256-cbc为16个字节)。 I found a blog post描述了如何使用OpenSSL执行此操作:
openssl enc -e -aes-256-cbc -K 0123456789ABCDEF -iv 0000000000000000 < file | tail -c 16 | od -A n
-K
是您提供密钥的地方,如果您正在对文件进行加密,那么维基页面应该与您用来加密文件的密钥不同。-iv
显然提供全零IV,这是CBC-MAC的关键。tail -c 16
是获取最后一个16字节长的AES256-cbc块。od
是将其转换为十六进制,该网站说这是常见的。否则,od -A n
代替base64
,如果更适用,可以{{1}},或者完全不使用原始字节。您无法获取文件的AES HMAC,因为AES256-cbc是分组密码,而不是散列算法。 AES256-cbc用于加密和解密文件。 HMAC用于验证文件的完整性,并且在其核心需要哈希算法,例如SHA-1或MD5。
您是要尝试签名或验证文件,还是加密文件?要签名,请查看OpenSSL dgst命令并使用简单的HMAC,如MD5或SHA-1,或全力以赴,并使用DSS / DSA对其进行数字签名。
另外,我认为使用块密码作为MAC称为EMAC,但据我所知,OpenSSL不执行EMAC。 EMAC只获取加密文件的最后一个块并对其进行加密以创建MAC。
答案 1 :(得分:2)
您可以使用AES密钥作为HMAC的输入来执行文件的HMAC。
使用您想要的任何AES算法加密文件(在本例中为-aes-256-cbc);根据密码生成AES密钥(将密码更改为密码),并使用-p开关转储用于加密的salt,key和iv。
openssl enc -e -k password -p -aes-256-cbc -in plaintext -out ciphertext
salt=A2402067B9BFD4A1
key=EB3A88115C30F26C3987F1AB2577DF5B58C80EBEEA623506517FAD843C64E1FC
iv =B382453BCBF579CE14C0726D343F40E2
使用您选择的哈希算法和用于加密文件的AES密钥创建任何对象/文件的HMAC:
openssl dgst -hmac EB3A88115C30F26C3987F1AB2577DF5B58C80EBEEA623506517FAD843C64E1FC -sha256 ciphertext
HMAC-SHA256(ciphertext)= fa3fb9c9c743f35ba81793e2704c3fc9737cd2675011110cb1655ea7ceed2914
如果您需要验证HMAC,请记住以后使用的AES密钥。请注意,我不知道您要完成什么,我不能声称上述内容符合您的加密要求,但它确实显示了如何加密文件,获取加密密钥,以及在HMAC计算中使用该加密密钥。