在 OpenVPN 中使用 RSA-SHA 作为/而不是 HMAC?

信息安全 验证 密码学 hmac 打开VPN
2021-08-14 16:36:33

在阅读 OpenVPN 2.3 的手册时,我遇到了这个--auth alg选项。手册说:

使用消息摘要算法使用 HMAC 验证数据包alg(默认为 SHA1 )。HMAC 是一种常用的消息认证算法 (MAC),它使用数据字符串、安全哈希算法和密钥来生成数字签名。

据我了解,HMAC 只是从散列函数制作 MAC 的首选方式,同时可能避免某些散列函数的长度扩展特性。

所以--auth选项中指定的算法应该是哈希函数。

现在,如果我确实openvpn --show-digests知道可以使用该--auth选项使用哪些算法,我还会获得以下条目:

RSA-SHA, DSA-SHA, ECDSA-WITH-SHA1... etc.

这些是数字签名算法,为什么要在 HMAC 中使用它们?获得某种“双重身份验证”?是不是有点矫枉过正?

或者这是否意味着在这种情况下 HMAC 实际上被数字签名取代以实现身份验证?如果是这种情况,在安全性方面使用什么更好?

1个回答

查看 OpenVPN 的源代码,这似乎是 OpenSSL 的一个外观怪癖。

使用 时--show-digests,OpenVPN 调用 OpenSSL EVP_get_digestbynid(),参数为从 0 到 999 的所有整数。对于其中一些值,EVP_get_digestbynid()返回一个非 NULL 指针,该指针标识相应的哈希函数实现,然后 OpenVPN 打印出相应的名称。

碰巧在 ID = 64 的情况下,您会得到一个实现 SHA-1 的结构,并且 ID 值 64 对应的名称是“SHA1”。但是,如果 ID = 65,您将获得完全相同的结构(RAM 中的相同指针),即完全相同的 SHA-1 实现。但是ID值65对应的名字是“RSA-SHA1”。

当您使用--auth时,同样适用:OpenVPN 使用EVP_get_digestbyname()提供的字符串上的 。使用“SHA1”,您可以获得一个指向实现 SHA-1 的结构的指针。使用“RSA-SHA1”,您将再次获得完全相同的指针值。

换句话说,您会看到一些带有 RSA 或 ECDSA 的“替代名称”,但这只是 OpenSSL 如何命名事物的结果,如果您使用这些名称,您只会获得底层哈希函数(用于 HMAC),仅此而已. 因此,--auth SHA1--auth RSA-SHA1是完全等价的。