0

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

我目前正在使用 RNGCryptoServiceProvider 的 GetBytes() 方法来生成密钥,但它返回的字节数组包含不可打印的字符。所以我想知道对结果进行base64编码是否安全,或者这是否会过多地侵蚀随机性并使事情变得不那么安全?如果这不是一个好方法,你能推荐一个吗?

我确实明白,通过将键限制为可打印字符,我限制了键空间的整体宽度(即:去掉 8 位中的 1 位),但我对此表示满意。

4

2 回答 2

3

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

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

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

于 2010-12-01T23:31:38.573 回答
3

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

这种转换不会以任何方式改变信息,只是改变它的存储方式。它也是可逆的:你可以通过解码 BASE64 输出得到原始字节序列。

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

于 2010-12-01T23:34:18.280 回答