尝试创建一个256位密钥以存储在web.config中

时间:2015-08-17 17:41:19

标签: c# cryptography aes

我正在尝试创建256位密钥并在AES加密中使用它,我需要将其存储在我的web.config文件中,因此必须将其转换为字符串。

我使用的地穴库是:https://gist.githubusercontent.com/jbtule/4336842/raw/8da408b55fe9f94adb3319ed6491897d0ebac790/AESThenHMAC.cs

因此,例如方法签名如下:

public static string SimpleEncrypt(string secretMessage, byte[] cryptKey, byte[] authKey,
                                           byte[] nonSecretPayload = null)

我尝试了以下内容,但它返回了有趣的角色:

var hmac = new HMACSHA256();
var keyHex = System.Text.Encoding.UTF8.GetString(hmac.Key);

我需要创建一个类似的秘密密钥,因为它也是256位,我需要存储在web.conf文件中。

希望有人可以帮助我

2 个答案:

答案 0 :(得分:4)

作为一般规则,当需要将任意二进制数据存储为文本时(例如,将字节数组存储为属性文件中的文本),则应使用更便携的二进制数据形式。

有很多这些,使用取决于开发人员的偏好,预期用途,性能问题等。

目前最常用的二进制数据便携式存储格式为Base 64(https://en.wikipedia.org/wiki/Base64)。将字节存储到文本文件时,应将字节转换为Base64字符串,并在将其加载到代码中时将其转换回字节。

在C#中,使用的实现会因实际平台而异,而且您总能找到许多可提供此实现的库。例如,在某些版本的.NET框架中,您可以使用https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/system.convert.frombase64string(v=vs.110).aspx

答案 1 :(得分:0)

您向类询问它用于实例化HMACSHA256的密钥。 HMACSHA256的Key属性为:

  

获取或设置要在哈希算法中使用的键。 (继承自HMAC。)

如果没有指定密钥,.NET类将生成自己的随机密钥。然而,密钥使用作为输入参数用于HMAC功能(可以使用任何大小的密钥), HMAC的输出,这将是256位。

如果您想要新生成的密钥,则应使用RNGCryptoServiceProvider的实例来生成256位(32字节)的随机密钥。然后,您可以将这些字节直接用作您正在使用的AES类中的键值。

如果要将密钥存储为文本,则需要将其编码为十六进制或基数为64.如果直接将其视为文本,则会得到随机(“有趣”)字符,这就是只有如果这些字节可以显示为可打印的字符。