如果我以hmac模式运行openssl命令行(如下所示),是否使用了直接使用的hmac的密钥,还是在将其用作密钥之前进行了哈希?
echo "foo" | openssl dgst -sha256 -binary -hmac "test" | openssl base64
同样,使用openssl加密文件(如下所示)是使用盐进行哈希的密码短语? (如果是这样,它是如何完成的?指向正确源文件的指针会更好。)
openssl enc -salt
答案 0 :(得分:2)
hmac选项不使用salting或散列;它只是直接使用密码作为密钥。请参阅源代码分发中的apps/dgst.c
:
else if (!strcmp(*argv,"-hmac"))
{
if (--argc < 1)
break;
hmac_key=*++argv;
}
...
if (hmac_key)
{
sigkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, e,
(unsigned char *)hmac_key, -1);
if (!sigkey)
goto end;
}
enc
命令确实似乎使用某种形式的腌制,至少在某些情况下。相关的源文件是apps/enc.c
,但似乎有一些警告:
/* Note that str is NULL if a key was passed on the command
* line, so we get no salt in that case. Is this a bug?
*/
if (str != NULL)
{
/* Salt handling: if encrypting generate a salt and
* write to output BIO. If decrypting read salt from
* input BIO.
*/
然后使用函数EVP_BytesToKey
(在crypto/evp/evp_key.c
中)生成随机密钥。这个函数似乎是一个非标准的算法,看起来似乎很简单,但我无法证明这一点。
源代码片段和评论都来自OpenSSL 1.0.0版本。