2015-08-17 1 views
1

Я пытаюсь создать 256-битный ключ и использовать его в AES-шифровании, и мне нужно сохранить его в моем файле web.config, чтобы он был преобразован в строка.Попытка создать 256-битный ключ для хранения в 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.

Надеясь кто-то может помочь мне

+0

Право. Клавиши HMAC - это симметричные клавиши. Обычно они состоят из случайных байтов.Случайные байты, как правило, не представляют собой корректный текст в кодировке UTF-8, поэтому вы не можете * декодировать * их на строки таким образом. Вы должны * закодировать * их, используя базу 64, как предлагает Павел. –

+0

@PawelVeselov: Сделайте этот ответ и включите пример, который вызывает 'Convert.ToBase64String'. Я бы поднял его. –

+0

@MaartenBodewes Confused, почему HMACSHA256 создает ключ размером 64. Как создать размер 32? –

ответ

4

Как правило, когда есть необходимость хранить произвольные двоичные данные в виде текста (например, имея массив байтов хранится в виде текста в файле свойств), затем еще переносная форма двоичных данных.

Существует целый ряд тех, и использование зависит от предпочтений разработчика, предназначению, проблем производительности и т.д.

Наиболее часто в настоящее время используется формат для портативного хранения двоичных данных в виде текста Base 64 (https://en.wikipedia.org/wiki/Base64). Вы должны преобразовать байты в строку Base64 при хранении в текстовый файл и преобразовать его обратно в байты при загрузке в свой код.

В C# реализация, используемая для реализации, будет зависеть от реальной платформы, плюс вы всегда сможете найти несколько библиотек, которые предоставили бы эту реализацию. Например, в некоторых версиях .NET framework вы можете использовать https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx и https://msdn.microsoft.com/en-us/library/system.convert.frombase64string(v=vs.110).aspx

+0

Если мне нужно преобразовать ключ в 32, возможно ли это? –

+1

@coolbreeze вы должны потратить некоторое время на понимание base64. Это означает, что он использует 64 символа в качестве алфавита для кодирования, не имеет ничего общего с размером или видом ввода. Вы можете использовать base32 или даже base2 для вашей кодировки, но это сделает текст более крупным без каких-либо преимуществ для вашего дела. –

0

Вы запрашиваете класс для ключа, который он использует для создания экземпляра HMACSHA256. Key property of HMACSHA256 читает:

Получает или задает ключ для использования в алгоритме хеширования. (Унаследовано от HMAC.)

Если ключ не указан, классы .NET будут генерировать свой собственный случайный ключ. Тем не менее, ключ использовал как входной параметр для функции HMAC (который может принимать ключи любого размера), не выход HMAC, который будет 256 бит.

Если вы хотите только что сгенерированный ключ, вы должны использовать экземпляр RNGCryptoServiceProvider вместо этого, чтобы сгенерировать случайный ключ из 256 бит (32 байта). Затем вы можете использовать эти байты непосредственно как ключевое значение в классе AES, который вы используете.

Если вы хотите сохранить ключ в виде текста, вам нужно закодировать его как шестнадцатеричные или основание 64. Если вы просматриваете его как текст, вы получите случайный («смешно») символов, и это только если байты могут отображаться как печатные символы.

Смежные вопросы