HMAC после решения для шифрования в Java

Я хочу зашифровать файл cookie и убедиться, что файл cookie не изменен, поэтому я использую HMAC для зашифрованного файла cookie.

Есть несколько способов реализации:

<сильный>1. HMAC в зашифрованном файле cookie

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie )

-- Сохраняемый файл cookie со значением: зашифрованныйCookie + ":" + mac

<сильный>2. HMAC в зашифрованном файле cookie и ключе sercet HMAC

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + Hmac's secretKey )

-- Сохраняемый файл cookie со значением: зашифрованныйCookie + ":" + mac

<сильный>3. HMAC на зашифрованном файле cookie и некоторых неочевидных СТАТИЧЕСКИХ данных

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + java.sql.ResultSet.class.getName() )

-- Сохраняемый файл cookie со значением: зашифрованныйCookie + ":" + mac

У кого-нибудь есть идеи? Какой из них лучше? ИЛИ какое у вас решение? Благодарю вас!


person Loc    schedule 07.05.2014    source источник


Ответы (2)


Функция HMAC уже должна быть активирована. Поэтому обычно HMAC отображается как HMAC(K, M), где K — ключ, а M — сообщение. Таким образом, кандидат 2 не имеет смысла в этом отношении; это будет означать, что ключ K включается в расчет 3 раза (поскольку ключ используется два раза в самом HMAC).

По той же причине не имеет смысла использование куки с данными, которые невозможно угадать. Частью ввода HMAC является ключ K, который уже является неугадываемыми данными. Таким образом, вы не получите никакой безопасности и усложните свой протокол.

Теперь AES следует использовать в режиме CBC или CTR. Режим шифрования ECB небезопасен. Это означает, что вам требуется случайный IV (CBC) или уникальный IV (CTR). Этот IV должен быть частью HMAC, в противном случае злоумышленник все еще может изменить открытый текст, который вы получите после расшифровки.

person Maarten Bodewes    schedule 07.05.2014
comment
Спасибо за ваш ответ. Можете ли вы объяснить это: этот IV должен быть частью HMAC? Вы имеете в виду mac = HMac (IV AES + сообщение)? - person Loc; 08.05.2014
comment
Да, если бы IV был префиксом к зашифрованному тексту, у вас было бы HMAC(Kmac, IV | E(Kenc, M)). - person Maarten Bodewes; 08.05.2014
comment
Спасибо @olwstead. Я проголосовал за ваш ответ, и я увижу другие идеи. - person Loc; 08.05.2014
comment
Хорошо. Вы даже можете изменить принятый ответ, если хотите... Обратите внимание, что вам не нужно использовать [at]owlstead, если вы реагируете на мой собственный ответ (и мне не нужно использовать [at]Loc, поскольку вы будете уведомлены всех реакций). - person Maarten Bodewes; 08.05.2014
comment
Обратите внимание, что owlstead показывает два ключа: Kmac и Kenc. Вы должны использовать два отдельных ключа: один для шифрования/дешифрования данных и один для генерации/проверки HMAC. - person Jim Flood; 17.05.2014

Варианты 2 и 3 фактически одинаковы, если предположить, что статические данные действительно невозможно угадать (и одинаковая длина и т. д.). Если вы серьезно обеспокоены тем, что кто-то изменит файл cookie, тогда вариант 2 лучше, поскольку (при условии, что секретный ключ не используется совместно) он позволит вам определить, были ли внесены изменения в файл cookie, и не позволит кому-либо изменить файл cookie, а затем перезапустить хэш для подделки Mac. На практике, если ключ AES недоступен, а данные в файле cookie имеют какое-то семантическое значение, вы, вероятно, сможете обнаружить изменения в зашифрованном файле cookie, поскольку он будет расшифрован во что-то бессмысленное. Однако с точки зрения безопасности вариант 2 обеспечит наилучшие гарантии того, что данные не были изменены.

Все это говорит о том, что я делаю ряд предположений о вашей настройке, которые могут быть или не быть правдой.

Изменить Очевидно, я неправильно понял вопрос относительно ключевых данных и недостаточно четко изложил свои предположения. @owlstead's - лучший ответ.

person Chris Thompson    schedule 07.05.2014
comment
-1: На практике, если ключ AES недоступен и данные в файле cookie имеют какое-то семантическое значение, вы, вероятно, сможете обнаружить изменения в зашифрованном файле cookie, поскольку он будет расшифрован во что-то бессмысленное. - Неверно, если AES используется в режиме CTR, и очень велика опасность атаки заполняющего оракула в случае CBC (пример из реальной жизни: weblogs.asp.net/scottgu/archive/2010/09/18/ ). - person Perseids; 08.05.2014