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

我目前正在使用rngcryptoserviceprovider的getBytes()方法来生成键,但是它返回的字节数组包含不可打印的字符。因此,我想知道base64是否安全编码结果,或者是否会过多地侵蚀随机性并使事情变得更加安全?如果那不是一个好方法,您可以建议一个吗?

我确实知道,通过将钥匙限制在可打印的字符上,我将限制关键空间的整体广度(即:在8位中脱掉1个),但我对此表示满意。

有帮助吗?

解决方案

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

Base64不会减少字节阵列的基础熵。您可以生成键并以原始形式使用它,但是Base64将其编码以将其运输到您需要的位置。然后,您将Base64在新位置使用之前将其解码回原始表单。此操作没有熵的损失。基本64编码的熵将熵降低到每个字节而不是8位,但是编码的结果更长,因此总体而言,熵是相同的。

您可以做的另一种方式是,以192位的熵获得24个随机字节。编码这将为您提供32个字符串(256位)的base64,该字符串仍然具有原始的随机性和192位的熵。您可以直接将其用作共享密钥。

其他提示

base64转换一个字节序列,因此仅使用某些可打印字符。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top