在.Net中生成可打印的HMAC共享密钥

时间:2010-12-01 23:23:57

标签: c# security encryption hmac

我正在使用HMACSHA512使用共享密钥散列数据。由于密钥是共享的,我希望它是所有可打印的字符,以便于运输。我想知道生成这些密钥的最佳方法是什么。

我目前正在使用RNGCryptoServiceProvider的GetBytes()方法生成一个键,但它返回的字节数组包含不可打印的字符。所以我想知道base64编码结果是否安全,或者是否会过度侵蚀随机性并使安全性降低?如果这不是一个好的方法,你可以提出一个吗?

我明白通过将键限制为可打印字符,我限制了键空间的整体宽度(即:从8位中删除1),但我对此感到满意。

2 个答案:

答案 0 :(得分:3)

如果您处理不自动生成密钥,则http://www.grc.com/passwords是非常随机密钥材料的良好来源。

Base64不会降低字节数组的基础熵。您可以生成密钥并以原始形式使用它,但Base64对其进行编码以将其传输到您需要的位置。然后,在新位置使用之前,Base64会将其解码回原始格式。此操作中没有熵损失。 Base64编码将熵减少到每字节6位而不是8位,但编码结果更长,因此整体熵是相同的。

你可以做的另一种方法是获得24个随机字节,用于192位的熵。 Base64编码会给你一个32字符串(256位),它仍然具有原始的随机性和192位的熵。您可以直接将其用作共享密钥。

答案 1 :(得分:3)

BASE64转换字节序列,因此它只使用某些可打印的字符。

此转换不会以任何方式更改信息,只会更改信息的存储方式。它也是可逆的:您可以通过解码BASE64输出来获得原始字节序列。

因此,使用BASE64不会“侵蚀随机性”或以任何方式限制密钥空间。