Чому мені потрібно використовувати клас Rfc2898DeriveBytes (у .NET) замість того, щоб безпосередньо використовувати пароль як ключ або IV?


78

У чому різниця між використанням Rfc2898DeriveBytes і просто використанням Encoding.ASCII.GetBytes(string object);?

Я мав відносний успіх з будь-яким із підходів, перший - це більш довготривалий підхід, де як другий є простим і суть. Здається, обидва дозволяють зробити те саме, врешті-решт, але я намагаюся зрозуміти сенс у використанні першого над другим.

Основна концепція , яку я був в змозі зрозуміти, що ви можете перетворити рядки паролів в масиви байтів , які будуть використовуватися, наприклад , для симетричного шифрування класу, AesManaged. Через клас RFC, але ви можете використовувати значення солі та пароль під час створення вашого об'єкта rfc. Я припускаю, що це більш безпечно, але все-таки це в кращому випадку неосвічена здогадка! Крім того, це дозволяє повертати байтові масиви певного розміру, ну щось подібне.

Ось кілька прикладів, щоб показати вам, звідки я родом:

byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");

або

string password = "P@%5w0r]>";
byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);

Об'єкт 'rfcKey' тепер можна використовувати для налаштування властивостей .Key або .IV у класі симетричного алгоритму шифрування.

тобто

RijndaelManaged rj = new RijndaelManaged ();
rj.Key = rfcKey.Getbytes(rj.KeySize / 8); 
rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);

'rj' повинен бути готовий до роботи!

Заплутана частина ... так що замість використання об'єкта 'rfcKey' я можу не просто використовувати свій масив 'myPassInBytes', щоб допомогти налаштувати мій об'єкт 'rj'?

Я спробував це зробити у VS2008, і негайна відповідь - НІ. Але чи отримали ви, хлопці, більш освічену відповідь, чому клас RFC використовується над іншою альтернативою, яку я згадав вище?


Це питання стосується перегляду та підготовки до іспиту!
IbrarMumtaz,

Відповіді:


187

Ви дійсно, дуже не хочете використовувати пароль користувача безпосередньо як крипто-ключ, особливо з AES.

Rfc2898DeriveBytes - це реалізація PBKDF2. Що він робить, це багаторазовий хеш пароля користувача разом із сіллю. Це має кілька переваг:

По-перше, ви можете використовувати паролі довільного розміру - AES підтримує лише певні розміри ключів.

По-друге, додавання солі означає, що ви можете використовувати одну і ту ж парольну фразу для створення декількох різних ключів (припускаючи, що сіль не є константою, як у вашому прикладі). Це важливо для розділення ключів; повторне використання ключів у різних контекстах є одним із найпоширеніших способів зламу криптографічних систем.

Кілька ітерацій (1000 за замовчуванням) уповільнюють атаки вгадування пароля. Розгляньте когось, хто намагається вгадати ваш ключ AES. Якщо ви просто використовували пароль, це було б просто - просто спробуйте кожен можливий пароль як ключ. З іншого боку, за допомогою PBKDF2 зловмисник спочатку повинен виконати 1000 ітерацій хешу для кожного вгадування пароля. Тож, хоча це лише трохи уповільнює користувача, воно має непропорційний вплив на зловмисника. (Насправді досить часто використовують набагато більший показник ітерацій; зазвичай рекомендується 10000).

Це також означає, що кінцевий вихідний ключ рівномірно розподілений. Наприклад, якщо ви використовували пароль, зазвичай 16 із 128 бітів ключа були б 0 (високий біт ASCII). Це одразу робить пошук ключів в 65536 разів простішим, ніж це повинно бути, навіть ігноруючи вгадування пароля.

Нарешті, AES має специфічні вразливості, пов’язані з ключовими атаками. Пов’язані атаки на ключі можливі, коли зловмисник знає деякі дані, зашифровані кількома ключами, і між ними існує якесь відоме (або здогадане) відношення. Наприклад, якщо ви зашифрували дані як за допомогою пароля-ключа "Мій ключ AES відстій" (16 байт, для AES-128), так і за допомогою "МОЙ АЕС-КЛЮЧ", можливо, пов'язана атака ключа. Найвідоміші в даний час атаки насправді не дозволяють таким чином порушити повний AES, але з часом вони поступово покращуються - буквально минулого тижня була опублікована нова атака, яка розбиває 13 раундів (із 14 загальних) AES-256 за пов'язана атака на ключ. Було б глибоко нерозумно покладатися на такі атаки, які з часом не покращуються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.