Принципова різниця між алгоритмами хешування та шифрування


509

Я бачу багато плутанини між алгоритмами хешей та шифрування, і хотів би почути ще кілька порад щодо:

  1. Коли використовувати хеші та шифрування

  2. Що робить алгоритм хешування чи шифрування різним (з теоретичного / математичного рівня), тобто що робить хеші незворотніми (без допомоги райдужного дерева)

Ось декілька подібних запитань ТА, які не вникали в такі деталі, як я шукав:

Яка різниця між обтурацією, хешированием і шифруванням?
Різниця між шифруванням та хешированием


28
Я можу передбачити, що це питання, до якого потрібно звертати людей, коли вони плутають умови. :)
Адам Пейнтер

18
хешування - це один спосіб (неможливо повернути), шифрування - двостороннє (можна розшифрувати)
bestsss

Хеші також корисні для індексації великих структур та об'єктів, наприклад файлів. Дивіться хеш-таблицю .
HABO

22
Вилуплення - як м'ясорубка. Можна перетворити корову на гамбургер, але не навпаки.
Ніл Макгуйган

Я помітив, що моє запитання було відредаговано. Я завжди знав відмінності між вищим рівнем між цими двома, але мені було цікавіше низький рівень / математичні відмінності. :) У будь-якому випадку, багато хорошого вмісту для ТА! Дуже дякую!
Кенні Кейсон

Відповіді:


738

Що ж, ти можеш шукати це у Вікіпедії ... Але оскільки ти хочеш пояснення, я тут все зроблю:

Хеш-функції

Вони забезпечують відображення між входом довільної довжини та вихідним (як правило) фіксованою довжиною (або меншою довжиною). Це може бути що завгодно, від простого crc32, до повноцінної криптографічної хеш-функції, такої як MD5 або SHA1 / 2/256/512. Справа в тому, що відбувається одностороннє відображення. Його завжди багато: 1 відображення (тобто завжди буде зіткнення), оскільки кожна функція дає менший вихід, ніж здатна вводити (Якщо ви подасте всі можливі файли 1 Мб в MD5, ви отримаєте тонну зіткнень).

Причина, по якій їх важко (або неможливо практично), полягає в тому, як вони працюють внутрішньо. Більшість криптографічних хеш-функцій багато разів повторюють набір входів для отримання виводу. Отже, якщо ми подивимось на кожен фрагмент вхідної фіксованої довжини (який залежить від алгоритму), хеш-функція буде називати цей стан. Потім він повторить стан і змінить його на новий і використовуватиме це як зворотній зв'язок із собою (MD5 робить це 64 рази для кожного 512-бітного фрагмента даних). Тоді якимось чином поєднуються результуючі стани з усіх цих ітерацій разом, щоб утворити отриманий хеш.

Тепер, якщо ви хотіли розшифрувати хеш, спершу потрібно розібратися, як розділити даний хеш на його ітераційні стани (1 можливість для входів, менших за розмір фрагмента даних, багато для більшого введення). Тоді вам потрібно буде змінити ітерацію для кожного стану. Тепер, щоб пояснити , чому це дуже важко, уявіть собі , намагаючись вивести aі bз наступної формули: 10 = a + b. Є 10 позитивних комбінацій, aі bце може спрацювати. Тепер прокрутіть цю групу разів:tmp = a + b; a = b; b = tmp. Для 64 ітерацій у вас буде більше 10 ^ 64 можливостей спробувати. І це просто просте доповнення, де певний стан зберігається від ітерації до ітерації. Реальні хеш-функції виконують набагато більше, ніж 1 операція (MD5 робить близько 15 операцій на 4 змінних стану). А оскільки наступна ітерація залежить від стану попереднього, а попередня руйнується при створенні поточного стану, визначити вхідний стан, який призвів до заданого вихідного стану (для кожної ітерації не менше), майже неможливо. Поєднайте це, якщо велика кількість залучених можливостей і декодування навіть MD5 забирає майже нескінченну (але не нескінченну) кількість ресурсів. Стільки ресурсів, що це "

Функції шифрування

Вони забезпечують зіставлення 1: 1 між входом і виходом довільної довжини. І вони завжди оборотні. Важливо зазначити, що це оборотно, використовуючи якийсь метод. І це завжди 1: 1 для даного ключа. Тепер є кілька входів: пари клавіш, які можуть генерувати один і той же вихід (насправді вони зазвичай є, залежно від функції шифрування). Хороші зашифровані дані не відрізняються від випадкового шуму. Це відрізняється від хорошого хеш-виводу, який завжди має послідовний формат.

Використовуйте випадки

Використовуйте хеш-функцію, коли ви хочете порівняти значення, але не можете зберігати просте подання (з будь-якої кількості причин). Паролі повинні дуже добре відповідати цьому випадку використання, оскільки ви не хочете зберігати їх у простому тексті з міркувань безпеки (і не повинні). Але що робити, якщо ви хочете перевірити файлову систему на наявність піратських музичних файлів? Зберігати 3 мб на музичний файл було б недоцільно. Тому замість цього візьміть хеш файлу і збережіть його (md5 зберігатиме 16 байт замість 3mb). Таким чином, ви просто хеш-файли кожного файлу і порівняти зі збереженою базою хешей (Це не працює так добре на практиці через повторне кодування, зміну заголовків файлів тощо, але це приклад використання).

Використовуйте хеш-функцію під час перевірки дійсності вхідних даних. Ось для чого вони розраховані. Якщо у вас є 2 фрагменти введення, і ви хочете перевірити, чи вони однакові, запустіть обидва за допомогою хеш-функції. Ймовірність зіткнення є астрономічно низькою для невеликих розмірів вводу (якщо припустимо хорошу хеш-функцію). Ось чому це рекомендується для паролів. Для паролів до 32 символів md5 має 4-кратний простір виводу. SHA1 має 6-кратний вихідний простір (приблизно). SHA512 має приблизно в 16 разів більше місця на виході. Вас не цікавить, який був пароль , ви хвилюєтеся, чи він такий, як той, що зберігався. Ось чому слід використовувати хеші для паролів.

Використовуйте шифрування щоразу, коли вам потрібно буде вимкнути вхідні дані. Зауважте, слово потрібно . Якщо ви зберігаєте номери кредитних карт, вам потрібно буде їх повернути в якийсь момент, але не хочете зберігати їх звичайним текстом. Тому замість цього зберігайте зашифровану версію і зберігайте ключ максимально безпечним.

Функції хешу також чудово підходять для підписання даних. Наприклад, якщо ви використовуєте HMAC, ви підписуєте фрагмент даних, взявши хеш даних, об'єднаних з відомим, але не переданим значенням (секретним значенням). Отже, ви надсилаєте звичайний текст та хэш HMAC. Потім приймач просто хеширує подані дані з відомим значенням і перевіряє, чи відповідає вони переданому HMAC. Якщо це те саме, ви знаєте, що його не було підроблено стороною без секретного значення. Це зазвичай використовується в захищених системах файлів cookie в рамках HTTP-систем, а також при передачі повідомлень даних через HTTP, де ви хочете певну впевненість у цілісності даних.

Примітка про хеші паролів:

Ключова особливість криптографічних хеш-функцій полягає в тому, що їх потрібно створювати дуже швидко і дуже важко / повільно повертати (настільки, що це практично неможливо). Це створює проблему з паролями. Якщо ви зберігаєте sha512(password), ви не займаєтесь захистом від веселкових столів або грубих атак. Пам'ятайте, хеш-функція була розроблена для швидкості. Тож для зловмисника банально просто запустити словник через хеш-функцію і перевірити кожен результат.

Додавання солі допомагає вирішити питання, оскільки вона додає трохи невідомих даних у хеш. Тож замість того, щоб знайти що-небудь, що відповідає md5(foo), їм потрібно знайти те, що при додаванні до відомої солі виробляє md5(foo.salt)(що зробити це набагато важче). Але це все ще не вирішує проблему зі швидкістю, оскільки якщо вони знають сіль, це лише питання проходження словника.

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

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Є інші, більш стандартні реалізації , такі як PBKDF2 , Bcrypt . Але ця методика використовується досить багатьма системами, що стосуються безпеки (наприклад, PGP, WPA, Apache та OpenSSL).

Суть, hash(password)недостатньо хороша. hash(password + salt)краще, але все ще недостатньо добре ... Використовуйте розтягнутий хеш-механізм для створення хешей для паролів ...

Ще одна примітка про тривіальне розтягування

Ні в якому разі не подайте вихід одного хеша безпосередньо в хеш-функцію :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

Причина цього пов'язана із зіткненнями. Пам'ятайте, що всі хеш-функції мають зіткнення, оскільки можливий вихідний простір (кількість можливих виходів) менший, ніж тоді вхідний простір. Щоб зрозуміти, чому, давайте подивимось, що відбувається. Для передмови це зробимо припущення, що існує шанс зіткнення 0,001% від sha1()( насправді це значно нижче, але для демонстраційних цілей).

hash1 = sha1(password + salt);

Зараз hash1є ймовірність зіткнення 0,001%. Але коли ми робимо наступне hash2 = sha1(hash1);, всі зіткнення hash1автоматично стають зіткненнямиhash2 . Отже, у нас показник хеш1 становить 0,001%, і другий sha1()виклик додає до цього. Тож зараз hash2є ймовірність зіткнення 0,002%. Це вдвічі більше шансів! Кожна ітерація додасть 0.001%до результату ще один шанс зіткнення. Так, з 1000 ітерацій шанс зіткнення підскочив з тривіальних 0,001% до 1%. Тепер деградація лінійна, і реальні ймовірності набагато менші, але ефект той самий (оцінка ймовірності одного зіткнення з md5приблизно 1 / (2 128 ) або 1 / (3x10 38). Хоча це здається малим, завдяки нападі на день народження, це насправді не так мало, як здається).

Натомість, повторно додаючи сіль та пароль кожен раз, ви знову вводите дані назад у хеш-функцію. Тож будь-яке зіткнення будь-якого конкретного раунду більше не є зіткненням наступного раунду. Тому:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Має такий самий шанс зіткнення, як і вроджена sha512функція. Якого ти хочеш. Використовуйте це замість цього.


30
Шкода, що програмісти в LinkedIn не читали цього, перш ніж вони зберігали паролі як несолоні хеші SHA1 ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Ерік Дж.

2
@Pacerier: він також трохи акцентує увагу на хешировании. Це детально розглядається спеціально щодо хешування паролів ...
ircmaxell

1
Я не розумію, як може бути від 1 до 1 відображення, якщо може бути кілька клавіш, що призводить до одного виводу. Для DES довжина ключа становить 56 біт, а розмір блоку - 64 біта. Отже, чи не існує 256 різних клавіш, які можуть відображати один і той же вихідний блок?
mrQWERTY

1
@ Renren29 так. Ви праві. На практиці весь шифр не є ні сурективним, ні ін'єкційним. Однак для даного ключа він є сюжективним (кожен звичайний текст має рівно один шифротекст), але не обов'язково ін'єктивний (не кожен можливий шифротекст має відображення назад). Тому я сказав, що це завжди 1: 1 для даного ключа . Якщо не було декількох клавіш, які могли б вивести один і той же вихідний блок, то шифр був би не корисним, оскільки шифротекст розповість вам щось про ключ (не знаючи про це).
ircmaxell

7
Чудова відповідь. Єдиний мій ніпель - це те, що деградація тривіального розтягування не може бути лінійною, і в кінцевому підсумку вона пройде 100%. Я думаю, що у вашому прикладі з .001% другим кроком має бути 0,001 + (1 - 0,001) * .001, або 0,001999.
AlexDev

160

Хеш-функцію можна вважати таким же, як випікати буханець хліба. Ви починаєте з введення (борошно, вода, дріжджі тощо) і після застосування функції хешу (змішування + випічка), ви закінчуєте вихід: буханець хліба.

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

Багато різних варіантів введення теоретично дадуть однакові хліби (наприклад, 2 склянки води та 1 ст. Ложка дріжджів дають рівно такий самий хліб, як 2,1 склянки води та 0,9 ст. Дп дріжджів), але, враховуючи один із цих хлібів, ви не можете сказати саме те, що комбо входів виробляло.

З іншого боку, шифрування може розглядатися як сейф. Що б ви там не помістили, то вийде, поки ви в першу чергу маєте ключ, з яким він був зафіксований. Це симетрична операція. Давши ключ і деякий вхід, ви отримаєте певний вихід. Враховуючи цей вихід і той самий ключ, ви отримаєте назад вихідний ввід. Це зіставлення 1: 1.


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

1
@caf lol справді і класика в цьому. Однак корова навряд чи змушує продавати її на ринок, це "бик", який робить ;-) Корова: молоко. Бик: м'ясо.
Funk Forty Niner

1
Ця історія за нею звучить надзвичайно смачно.
sitilge

44

Використовуйте хеші, коли ви не хочете мати можливість повернути початковий вхід, використовуйте шифрування, коли це робите.

Хеші беруть деякий вхід і перетворюють його на деякі біти (зазвичай їх вважають числом, як 32-бітове ціле число, 64-бітове ціле число тощо). Один і той же вхід завжди створюватиме один і той же хеш, але ви ВЗАЄМОГО втрачаєте інформацію в процесі, тому ви не зможете надійно відтворити вихідний вхід (однак є кілька застережень до цього).

Шифрування в основному зберігає всю інформацію, яку ви вводите у функцію шифрування, просто утрудняє (в ідеалі неможливо) повернення назад до початкового вводу, не маючи конкретного ключа.

Простий приклад хешування

Ось тривіальний приклад, який допоможе вам зрозуміти, чому хешування не може (в загальному випадку) повернути початковий вхід. Скажіть, я створюю 1-бітний хеш. Моя хеш-функція приймає бітовий рядок як вхідний і встановлює хеш на 1, якщо у вхідному рядку є парне число бітів, інакше 0, якщо було непарне число.

Приклад:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Зауважте, що існує багато вхідних значень, які призводять до хешу 0, і багато, які призводять до хешу 1. Якщо ви знаєте, що хеш дорівнює 0, ви не можете точно знати, яким був вихідний вхід.

До речі, цей 1-бітний хеш не зовсім надуманий ... подивіться на біт парності .

Простий приклад шифрування

Ви можете зашифрувати текст, використовуючи просту підстановку літер, скажімо, якщо введення А, ви пишете B. Якщо введення - B, ви пишете C. До кінця алфавіту, якщо, якщо вхід Z, ви написати ще раз.

Input   Encrypted
CAT     DBU
ZOO     APP

Так само, як простий хеш-приклад, такий тип шифрування використовувався історично .


Варто відзначити, що "шифрування" розмовно відноситься до сильного шифрування і не слід плутати зі слабким шифруванням, таким як шифр Цезаря у наведеному вище прикладі.
Факс

@ Факс Так, але те, що являє собою сильне шифрування, було рухомим баром протягом усіх віків. Німецьку машину Enigma Другої світової війни було майже неможливо зламати (про це чудовий фільм). Сьогодні ваш розумний годинник легко міг би його зламати. Колись DES вважався сильним, як і MD5. Сьогоднішнє сильне шифрування загрожує в найближчому майбутньому стати легкою здобиччю методик квантових обчислень.
Ерік Дж.

Напевно, і завжди корисно перевірити дати публікацій та статей, які дають поради щодо криптографії. Попри це, я впевнений, що шифр Цезаря вважався слабким навіть у 2011 році.
Факс

39

Основний огляд методів хешування та шифрування / дешифрування.

Хешинг:

Якщо хеш будь-якого простого тексту знову ви не можете отримати той же простий текст з хешірованного тексту . Просто, це однобічний процес.

хешування


Шифрування та дешифрування:

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

шифрування та дешифрування


ОНОВЛЕННЯ: Для вирішення питань, зазначених у відредагованому запитанні.

1. Коли використовувати хеші проти шифрування

Хешинг корисний, якщо ви хочете комусь надіслати файл. Але ви боїтесь, що хтось інший може перехопити файл і змінити його. Таким чином, одержувач може переконатися, що це правильний файл, якщо ви публікуєте хеш-значення публічно. Таким чином одержувач може обчислити хеш-значення отриманого файлу та перевірити, чи відповідає воно хеш-значенню.

Шифрування добре, якщо ви скажете, що маєте повідомлення, яке потрібно надіслати комусь. Ви шифруєте повідомлення ключем, а одержувач розшифровує тим самим (а може, навіть іншим) ключем, щоб повернути початкове повідомлення. кредити


2. Що відрізняє алгоритм хешування або шифрування (з теоретичного / математичного рівня), тобто те, що робить хеші незворотніми (без допомоги райдужного дерева)

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

Шифрування / розшифровка (оборотна):

Доповнення :

4 + 3 = 7  

Це можна змінити, взявши суму і віднісши одне з доданків

7 - 3 = 4     

Множення :

4 * 5 = 20  

Це можна змінити, взявши продукт і розділивши на один із факторів

20 / 4 = 5    

Отже, тут ми можемо припустити, що одне з додавань / факторів - це ключ розшифровки, а результат (7,20) - це зашифрований текст.


Штрихування (не оборотне):

Модульний поділ :

22 % 7 = 1   

Це не можна змінити, оскільки не існує операції, яку ви можете зробити з коефіцієнтом та дивідендом для відновлення дільника (або навпаки).

Чи можете ви знайти операцію, щоб заповнити місце "?" є?

1  ?  7 = 22  
1  ?  22 = 7

Тож хеш-функції мають таку ж математичну якість, що і поділ за модулем, і втрачають інформацію.

кредити


26

Мій один лайнер ... взагалі інтерв'юер хотів відповіді нижче.

Вилуплювання - один із способів. Ви не можете отримати конвертувати свої дані / рядки з хеш-коду.

Шифрування двосторонне - ви можете знову розшифрувати зашифрований рядок, якщо у вас є ключ.


Гей! Це два рядки.
Марк Сторер

17

Функція Hash перетворює кількість тексту змінного розміру в текст фіксованого розміру.

Хеш

Джерело: https://en.wikipedia.org/wiki/Hash_function


Хеш-функції в PHP

Хеш перетворює рядок у хешований рядок. Дивись нижче.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Паролі зазвичай зберігаються у хешированном поданні, а не як читабельний текст. Коли кінцевий користувач хоче отримати доступ до програми, захищеної паролем, тоді під час автентифікації повинен бути вказаний пароль. Коли користувач подає свій пароль, тоді діюча система аутентифікації отримує цей пароль і хеширует цей заданий пароль. Цей хеш пароля порівнюється з хешем, відомим системою. Доступ надається у випадку рівності.

ПОМИЛКА:

SHA1 - це односторонній хеш. А це означає, що ви не можете знешкодити хеш.

Однак ви можете жорстоко форсувати хеш. Дивіться: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, це ще один хеш. Дегазатор MD5 можна знайти на цьому веб-сайті: https://www.md5online.org/ .

Для стримування грубих нападів на хеши може бути надана сіль. У php ви можете використовувати password_hash()для створення хеша пароля. Функція password_hash()автоматично створює сіль. Для перевірки пароля на хеш пароля (з сіллю) використовуйте password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Один пароль може бути представлений більш ніж одним хешем. Якщо ви перевірите пароль з різними хешами паролів за допомогою password_verify(), тоді пароль буде прийнятий як дійсний.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Функція шифрування перетворює текст у безглуздий шифротекст, використовуючи ключ шифрування, і навпаки. введіть тут опис зображення

Джерело: https://en.wikipedia.org/wiki/Encryption


Шифрування в PHP

Давайте зануримось у якийсь PHP-код, який обробляє шифрування.

--- Розширення Макріпта ---

ЕКСПЛІАТ:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

ДЕКРИПТ:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Розширення OpenSSL ---

Продовження Макріпта було знято в 7.1. і видалено в php 7.2. Розширення OpenSSL слід використовувати в php 7. Дивіться фрагменти коду нижче:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)

Зауважте, що на сьогоднішній день mcrypt PHP застарілий (я, можливо, мав щось із цим) і що SHA-1, MD5 та ECB вважаються незахищеними. A_KEYце НЕ AES / Rijndael-128 ключа; це пароль, а не ке союзник.
Maarten Bodewes

@MaartenBodewes Так, це правда. OpenSSL - це примха зараз. php.net/manual/en/book.openssl.php
Джуліан

10

Симетричне шифрування:

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

введіть тут опис зображення

Асиметричне шифрування:

Асиметричне шифрування також відоме як криптографія з відкритим ключем. Асиметричне шифрування відрізняється від симетричного шифрування насамперед тим, що використовуються два ключі: один для шифрування та один для дешифрування. Найпоширеніший алгоритм асиметричного шифрування RSA.

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

введіть тут опис зображення

Хешинг:

Нарешті, хешування - це форма криптографічної безпеки, яка відрізняється від шифрування. Тоді як шифрування - це двоетапний процес, який використовується для спочатку шифрування, а потім дешифрування повідомлення, хешування конденсує повідомлення у незворотне значення фіксованої довжини або хеш. Два найпоширеніші алгоритми хешування, що спостерігаються в мережах, є MD5і SHA-1.

введіть тут опис зображення

Детальніше читайте тут: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/


Вибачте, я захисник, але чи можете ви далі пояснити значення "зазвичай використовується для захисту даних корисного навантаження"?
Абдул

2
@Abdul Асиметричне шифрування має високе обчислювальне навантаження, тому воно не використовується для захисту даних, що надсилаються по мережі у вигляді пакетів (корисного навантаження). Натомість використовується для встановлення захищеного мережевого з'єднання з використанням обміну відкритими ключами для захисту даних.
Лаки

5
  1. Використовуйте хеші, коли вам потрібно йти лише в один бік. Наприклад, для паролів у системі ви використовуєте хешування, оскільки ви коли-небудь перевірятимете, що значення, яке ввів користувач після хешування, відповідає значенню у вашому сховищі. З шифруванням ви можете піти двома шляхами.

  2. алгоритми хешування та алгоритми шифрування - це лише математичні алгоритми. Тож у цьому відношенні вони не відрізняються - це все лише математичні формули. Однак семантика мудра, є дуже велика різниця між хешированием (одностороннім) і шифруванням (двостороннім). Чому хеши незворотні? Тому що вони розроблені таким чином, тому що іноді потрібно односторонню операцію.


4

Алгоритми шифрування та хешування працюють аналогічно. У кожному випадку виникає необхідність створювати плутанину та дифузію між бітами. Збившись, плутанина створює складні відносини між ключем і шифротекстом, а дифузія поширює інформацію про кожен біт навколо.

Багато хеш-функцій фактично використовують алгоритми шифрування (або примітиви алгоритмів шифрування. Наприклад, кандидат SHA-3 Скейн використовує Threefish як основний метод для обробки кожного блоку. Різниця полягає в тому, що замість того, щоб зберігати кожен блок шифротексту, вони руйнуються, детерміновано злиті разом до фіксованої довжини


4

коли мова йде про безпеку для передачі даних, тобто для двостороннього зв’язку, ви використовуєте шифрування. Для кожного шифрування потрібен ключ

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

Хешинг приймає будь-яку кількість даних (двійкові або текстові) і створює хеш постійної довжини, що представляє контрольну суму для даних. Наприклад, хеш може бути 16 байт. Різні алгоритми хешуваннявання створюють хеші різного розміру. Ви, очевидно, не можете заново створити оригінальні дані з хеша, але ви можете їх хеш знову, щоб побачити, чи генерується те саме значення хеша. Односторонні паролі на основі Unix працюють таким чином. Пароль зберігається як хеш-значення, і для входу в систему, введений вами пароль хеширується, а значення хеша порівнюється з хесом реального пароля. Якщо вони збігаються, ви повинні ввести правильний пароль

чому хеширование незворотне:

Хеширование не є оборотним, оскільки відображення вводу в хеш не 1-до-1. Маючи два входи, які відображають однакове хеш-значення, зазвичай називають "хеш-зіткненням". З метою безпеки однією з властивостей «хорошої» хеш-функції є те, що зіткнення рідкісні у практичному використанні.


1
"Хешування не є оборотним, оскільки відображення введення в хеш не 1-на-1", Дякую, я думаю, що це дуже важливий фактор, коли мова йде про диференціювання хешей від шифрування! :)
Kenny Cason

Це не чітко розрізняє нормальні хеш-функції, криптографічні хеш-функції та хеші паролів. Всі вони мають різні властивості.
Maarten Bodewes

-2

Криптографія має справу з числами та рядками. В основному кожна цифрова річ у всьому Всесвіті - це цифри. Коли я кажу цифри, їх 0 і 1. Ви знаєте, що вони є, двійкові. Образи, які ви бачите на екрані, музика, яку ви слухаєте через навушники, все - це двійкові файли. Але наші вуха та очі не зрозуміють бінарних файлів правильно? Тільки мозок міг зрозуміти це, і навіть якщо він може розуміти двійкові файли, він не може насолоджуватися бінарними файлами. Таким чином, ми перетворюємо двійкові файли у зрозумілі для людини формати, такі як mp3, jpg тощо. Давайте назвемо процес кодуванням . Це двосторонній процес, і його можна легко розшифрувати назад у початковий вигляд.

Хешинг

Хешинг - це ще одна техніка криптографії, в якій дані, перетворені в іншу форму, ніколи не можуть бути відновлені. У терміні Леймана не існує жодного процесу, який називається знеструмленням . Існує багато хеш-функцій для виконання таких завдань, як sha-512, md5 тощо.

Якщо вихідне значення неможливо відновити, то де ми це будемо використовувати? Паролі! Під час налаштування пароля для вашого мобільного або ПК створюється хеш вашого пароля та зберігається в безпечному місці. Коли ви наступного разу зробите спробу входу, введена рядок знову хешируется з тим самим алгоритмом (хеш-функція), а висновок узгоджується зі збереженим значенням. Якщо це те саме, ви входите в систему. Інакше вас викидають.

Кредити: wikimedia Застосовуючи хеш до пароля, ми можемо гарантувати, що зловмисник ніколи не отримає наш пароль, навіть якщо він вкраде збережений файл пароля. Зловмисник матиме хеш пароля. Ймовірно, він може знайти список найчастіше використовуваних паролів і застосувати до нього sha-512 і порівняти його зі значенням у руці. Його називають словниковою атакою . Але як довго він би це робив? Якщо ваш пароль є достатньо випадковим, чи вважаєте ви, що цей спосіб зламування буде працювати? Усі паролі в базах даних Facebook, Google та Amazon є хешованими або, принаймні, вони повинні бути хешованими.

Тоді відбувається шифрування

Шифрування лежить між хешуванням та кодуванням. Кодування - це двосторонній процес, і його не слід використовувати для забезпечення безпеки. Шифрування також є двостороннім процесом, але вихідні дані можуть бути отримані лише тоді, якщо ключ шифрування відомий. Якщо ви не знаєте, як працює шифрування, не хвилюйтесь, тут ми обговоримо основи. Цього було б достатньо, щоб зрозуміти основи SSL. Отже, існує два типи шифрування, а саме симетричне та асиметричне шифрування.

Симетричне шифрування ключів

Я намагаюся тримати речі максимально просто. Отже, давайте розберемося в симетричному шифруванні за допомогою алгоритму зсуву. Цей алгоритм використовується для шифрування алфавітів, переміщуючи літери вліво або вправо. Візьмемо рядок CRYPTO і розглянемо число +3. Тоді зашифрований формат CRYPTO буде FUBSWR. Це означає, що кожна буква зміщена вправо на 3 місця. Тут слово CRYPTO називається Plaintext , вихід FUBSWR називається гіпертекст , значення +3 називається шифрування ключ (симетричний ключ) , і весь процес є шифром. Це один із найдавніших та основних алгоритмів шифрування симетричного ключа, про його перше використання повідомлялося ще за часів Юлія Цезаря. Отже, його назвали на честь нього і це знаменитий Цезар Шифр . Кожен, хто знає ключ шифрування, може застосувати зворотну сторону алгоритму Цезаря та отримати вихідний Plaintext. Звідси це називається симетричним шифруванням .

Асиметричне шифрування ключа

Ми знаємо, що в симетричному шифруванні використовується той самий ключ як для шифрування, так і для дешифрування. Після того, як цей ключ буде вкрадений, всі дані втрачаються. Це величезний ризик, і нам потрібна більш складна техніка. У 1976 році Вітфілд Діффі та Мартін Гелман вперше опублікували концепцію асиметричного шифрування, і алгоритм був відомий як обмін ключами Діффі-Гелмана . Потім у 1978 році Рон Рівест, Аді Шамір та Леонард Адлеман з MIT опублікували алгоритм RSA . Вони можуть розглядатися як основа асиметричної криптографії.

Порівняно з симетричним шифруванням, в асиметричному шифруванні буде два ключі замість одного. Один називається відкритим ключем , а другий - приватним ключем . Теоретично під час ініціації ми можемо генерувати державно-приватнеКлючова пара нашої машини. Приватний ключ слід зберігати в безпечному місці і його ніколи не можна ділити ні з ким. Публічним ключем, як вказує ім’я, можна ділитися з усіма, хто бажає надіслати вам зашифрований текст. Тепер ті, хто має ваш відкритий ключ, можуть зашифрувати його секретними даними. Якщо пара ключів була створена за допомогою алгоритму RSA, то вони повинні використовувати той самий алгоритм, шифруючи дані. Зазвичай алгоритм буде вказаний у відкритому ключі. Зашифровані дані можна розшифрувати лише за допомогою приватного ключа, який належить вам.

Джерело: SSL / TLS для манекенів, частина 1: Шифр, Хешинг, Шифрування | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )


-3

Шифрування Метою шифрування є перетворення даних, щоб зберегти їх у таємниці Напр. (Надіслати комусь секретний текст, який він повинен лише вміти читати, надсилаючи паролі через Інтернет).

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

Він шифрує дані в інший формат, перетворюючи їх на унікальний зразок, його можна зашифрувати секретним ключем, і ті користувачі, які мають секретний ключ, зможуть побачити повідомлення шляхом реверсивного процесу. Наприклад (AES, BLOWFISH, RSA)

Шифрування може просто виглядати таким чином FhQp6U4N28GITVGjdt37hZN

Хеш У технічно ми можемо сказати , що , як приймає вхідний сигнал і довільний отримують рядок фіксованої довжини.

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

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

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