Скільки хеш

Скільки хеш



«Привіт, світ»: розбираємо кожен крок хеш-алгоритму SHA-256


SHA-2 (Secure Hash Algorithm), до сімейства якого входить SHA-256, - ​​це один з найвідоміших і найчастіше використовуваних алгоритмів хешування. У тексті докладно покажемо кожен крок роботи цього алгоритму реальному прикладі. SHA-2 відрізняється безпекою (його важче зламати, ніж SHA-1) та швидкістю.

Що таке хеш-функція?

Три основні цілі хеш-функцій:

  • Детерміновано шифрувати дані (такий вид шифрування завжди створює одне й те саме зашифроване значення для того самого текстового значення);
  • Приймати введення будь-якої довжини, а виводити результат фіксованої довжини;
  • Змінювати дані необоротно. Введення не можна отримати з висновку.

SHA-256 «Привіт, мир»

Крок 1 - Попередня робота

Перетворюємо «Привіт, світ» у двійковий код:

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100 1

Доповніть код нулями, поки дані не дорівнюватимуть 512 біт, мінус 64 біти (в результаті 448 біт):

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

Додайте 64 біти на кінець у вигляді цілого числа з порядком байтів від старшого до молодшого (big-endian), що представляє довжину вхідного повідомлення у двійковому форматі. У нашому випадку це 88, або "1011000".

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01011000

Тепер у нас є введення, яке буде ділитися на 512 без залишку.

Крок 2 - Ініціалізуйте значення хеша (h)

Тепер ми створюємо 8 хеш значень. Це жорстко запрограмовані константи, які є першими 32 бітами дробових частин квадратного коріння з перших восьми простих чисел: 2, 3, 5, 7, 11, 13, 17, 19.

h0 := 0x6a09e667 h1 := 0xbb67ae85 h2 := 0x3c6ef372 h3 := 0xa54ff53a h4 := 0x510e527f h5 := 0x9b05688c h6 := 0x5be0cd19

Крок 3 - Ініціалізація округлених констант (k)

Як і в попередньому кроці ми створимо ще кілька констант. Цього разу їх буде 64. Кожне значення (0—63) є першими 32 бітами дробових частин кубічних коренів перших 64 простих чисел (2—311).

0x428a2f98 0x71374491 0xb5c0fbcf 0xe9b5dba5 0x3956c25b 0x59f111f1 0x923f82a4 0xab1c5ed5 0xd807aa95 c7dc3 0x72be5d74 0x80deb1fe 0x9bdc06a7 0xc19bf174 0xe49b69c1 0xefbe4786 0x0fc19dc6 0x240ca1cc 0x2de92c6c0 988da 0x983e5152 0xa831c66d 0xb00327c8 0xbf597fc7 0xc6e00bf3 0xd5a79147 0x06ca6351 0x14292967 0x27 0x53380d13 0x650a7354 0x766a0abb 0x81c2c92e 0x92722c85 0xa2bfe8a1 0xa81a664b 0xc24b8b70 0xc76c51a30 585 0x106aa070 0x19a4c116 0x1e376c08 0x2748774c 0x34b0bcb5 0x391c0cb3 0x4ed8aa4a 0x5b9cca4f 0x682e6ff3 0x748f82ee 0x78a5636f 0x84c8780000 0xbef9a3f7 0xc67178f2

Крок 4 - Цикл фрагментів

Наступні кроки будуть виконуватися для кожного 512-бітового "фрагменту" з наших вхідних даних. Оскільки фаза «Привіт, світ» коротка, ми маємо лише один фрагмент. У кожній ітерації циклу ми змінюватимемо хеш-значення h0-h7, що призведе нас до кінцевого результату.

Крок 5 — Створення розкладу повідомлень (w)

Скопіюйте вхідні дані з кроку 1 в новий масив, де кожен запис є 32-бітовим словом:

01101000011001010110110001101100 01101111001000000111011101101111 01110010011011000110010010000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000001011000

Додайте ще 48 слів, ініціалізованих нулем, щоб у нас вийшов масив w [0…63]

01101000011001010110110001101100 01101111001000000111011101101111 01110010011011000110010010000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000001011000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 . . 00000000000000000000000000000000 00000000000000000000000000000000

Змініть обнулені індекси наприкінці масиву, використовуючи наступний алгоритм:
Для i з w[16 ... 63]:

  • s0 = (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3)
  • s1 = (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10)
  • w[i] = w[i-16] + s0 + w[i-7] + s1
w[1] rightrotate 7: 01101111001000000111011101101111 -> 11011110110111100100000011101110 w[1] rightrotate 18: 01101111001000000111011101101111 -> 00011101110110111101101111001000 w[1] rightshift 3: 0110111100100001 00001101111001000000111011101101 s0 = 1101111011011110010000011101110 XOR 000111011101101111011011 00001101111001000000111011101101 s0 = 11001110111000011001010111001011 w[14] rightrotate 17: 0000000000000000 0000000000000000000000000000000 w[14] rightrotate19: 00000000000000000000000000000000000 w[14] rightshift 10: 000000000000000000000000000000 -> 00000000000000000000000000000000000000 XOR 00000000000000000000000000000000 XOR 0000000000000000000000000000000 s1 = 0000000000000000000000 s0 + w[9] + s1 w[16] = 01101000011001010110110001101100 + 1100111011100001100101111001011 + 000000000000000 0000000000000000000000000000000 // addition is calculated modulo 2^32 w[16] = 00110111010001110000001000110111

У розкладі повідомлень залишилося 64 слова (w):

01101000011001010110110001101100 01101111001000000111011101101111 01110010011011000110010010000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000001011000 00110111010001110000001000110111 10000110110100001100000000110001 11010011101111010001000100001011 01111000001111110100011110000010 00101010100100000111110011101101 01001011001011110111110011001001 00110001111000011001010001011101 10001001001101100100100101100100 01111111011110100000011011011010 11000001011110011010100100111010 10111011111010001111011001010101 00001100000110101110001111100110 10110000111111100000110101111101 01011111011011100101010110010011 00000000100010011001101101010010 00000111111100011100101010010100 00111011010111111110010111010110 01101000011001010110001011100110 11001000010011100000101010011110 00000110101011111001101100100101 10010010111011110110010011010111 01100011111110010101111001011010 11100011000101100110011111010111 10000100001110111101111000010110 11101110111011001010100001011011 10100000010011111111001000100001 11111001000110001010110110111000 00010100101010001001001000011001 00010000100001000101001100011101 01100000100100111110000011001101 10000011000000110101111111101001 11010101101011100111100100111000 00111001001111110000010110101101 11111011010010110001101111101111 11101011011101011111111100101001 01101010001101101001010100110100 00100010111111001001110011011000 10101001011101000000110100101011 01100000110011110011100010000101 11000100101011001001100000111010 00010001010000101111110110101101 10110000101100000001110111011001 10011000111100001100001101101111 01110010000101111011100000011110 10100010110101000110011110011010 00000001000011111001100101111011 11111100000101110100111100001010 11000010110000101110101100010110

Крок 6 - Стиснення

Ініціалізуйте змінні a, b, c, d, e, f, g, h та встановіть їх рівними поточним значенням хеш-функції відповідно h0, h1, h2, h3, h4, h5, h6, h7.

Запустіть цикл стиснення, який змінить значення a… h. Виглядає він так:

  • S1 = (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
  • ch = (e and f) xor ((no e) and g)
  • temp1 = h + S1 + ch + k[i] + w[i]
  • S0 = (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
  • maj = (a and b) xor (a and c) xor (b and c)
  • temp2 := S0 + maj
  • h = g
  • g = f
  • e = d + temp1
  • d = c
  • c = b
  • b = a
  • a = temp1 + temp2
a = 0x6a09e667 = 01101010000010011110011001100111 b = 0xbb67ae85 = 10111011011001111010111010000101 c = 02 00111100011011101111001101110010 d = 0xa54ff53a = 101001010100111111111010100111010 e = 0x510e527f = 01010001000011100101001001111111 f = 0x9b05688c = 10011011000001010110100010001100 g = 0x1f83d9ab = 00011111100000111101100110101011 h = 0x5be0cd19 = 01011011111000001100110100011001 e rightrotate 6: 01010001000011100101001001111111 -> 11111101010001000011100101001001 e rightrotate 11: 010100010000111101 010011111111010100010000111001010 e rightrotate 25: 01010001000011100101001001111111 -> 100001110010101010 11111101010001000011100101001001 XOR 010011111111010100010000111001010 XOR 10000111001010010011111111 00110101100001110010011100101011 e and f: 01010001000011100101001001111111 & 100110110000010101101000 00010001000001000100000000001100 not e: 01010001000011100101001001111111 -> 1010111011110001101010 10101110111100011010110110000000 & 00011111100000111101100110101011 = 000011101000000110001001100 and g) = 00010001000001000100000000001100 xor 0000111010000011000100110000000 = 00011111100001011100100 w[i] is the batch temp1 = h + S1 + ch + k[i] + w[i] temp1 = 01011011111000001100110100011001 + 00110101100001110010011100101 00011111100001011100100110001100 + 1000010100010100010111110011000 + 01101000011001010110110001101 01011011110111010101100111010100 a rightrotate 2: 01101010000010011110011001100111 -> 1101101010000010011 13: 01101010000010011110011001100111 -> 00110011001110110101000001001111 arightrotate 22: 01101010000010011110011001100111 -> 0010011100110011001110110101000 S0 = 11011010100000100 00110011001110110101000001001111 XOR 00100111100110011001110110101000 S0 = 1100111000100000101101001 01101010000010011110011001100111 & 10111011011001111010111010000101 = 0010101000000001101001100000 01101010000010011110011001100111 & 00111100011011101111001101110010 = 001010000000100011100010011 101110110110011110101111010000101 & 00111100011011101111001101110010 = 0011100001100110101000100000 (b and c) = 00101010000000011010011000000101 xor 0010100000000001110001001100010 xor 00111000011001101000 00111010011011111110011001100111 temp2 = S0 + maj = 11001110001000001011010001111110 + 001110100110111111110 00001000100100001001101011100101 h = 00011111100000111101100110101011 g = 10011011000001010110100000 01010001000011100101001001111111 e = 10100101010011111111010100111010 + 0101101111011101010110011 00000001001011010100111100001110 d = 00111100011011101111001101110010 c = 10111011011001111010111010 01101010000010011110011001100111 a = 01011011110111010101100111010100 + 0000100001001000010011010110 011001000110110111111010010111001

Усі обчислення виконуються ще 63 рази, змінюючи змінні a-h. На щастя, ми не робимо це вручну. У результаті ми отримали:

h0 = 6A09E667 = 01101010000010011110011001100111 h1 = BB67AE85 = 10111011011001111010111010000101 h2 = 3C6 00111100011011101111001101110010 h3 = A54FF53A = 101001010100111111111010100111010 h4 = 510E527F = 01010001000011100101001001111111 h5 = 9B05688C = 10011011000001010110100010001100 h6 = 1F83D9AB = 00011111100000111101100110101011 h7 = 5BE0CD19 = 0101101111100001100110100011001 a = 4F434152 = 0010011111010000110100000101010010 b = D7E58F83 = 011010111111001011000111110000011 c = 68BF5F65 = 0011010001011111101011111101100101 d = 352DB6C0 = 000110101001011011011011011000000 e = 73769D64 = 001110011011101101001110101100100 f = DF4E1862 = 011011111010011100001100001100010 g = 71051E01 = 001110001000001010001111000000001 h = 870F00D0 = 01000011100001111000000011010000

Крок 7 — Змініть остаточні значення

Після циклу стиснення, під час циклу фрагментів ми змінюємо хеш-значення, додаючи до них відповідні змінні a-h. Як і раніше, вся додавання проводиться за модулем 2 ^ 32:

h0 = h0 + a = 10111001010011010010011110111001 h1 = h1 + b = 10010011010011010011111000001000 h2 = h2 + c = 10100101001011100101001011010111 h3 = h3 + d = 1101101001111011010101111111010 h4 = h4 + e = 1100010010101 = h5 + f = 01111010010100111000000011101110 h6 = h6 + g = 10010000100010001111011110101100 h7 = h7 + h = 111000101110111111100110111101001

Крок 8 - Фінальний хеш

Зрештою, з'єднуємо всі разом.

digest = h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7 = B94D27B9934D3E08A52E52D7DA7DABFAC484EFE37A5380EE9088F7ACE2EFCDE9

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

Як працює Хешування

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

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

Навіщо використовується хеш?

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

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

Хеш-функція

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

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

Що таке хеш-таблиця?

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

Основні характеристики:

  • Хеш-функція. Це математичне правило, яке бере ключ і перетворює його на індекс масиву. Ефективна хеш-функція повинна рівномірно розподіляти ключі по всьому масиву.
  • Масив. Це основна структура даних, усередині якої зберігаються значення. Однак кожен осередок масиву може містити кілька записів, оскільки різні ключі можуть мати однаковий хеш.
  • Колізії. Колізії виникають, коли два різні ключі генерують однаковий хеш. Для ефективної роботи хеш-таблиці необхідний механізм дозволу колізій.

Області застосування хеш-таблиць:

  • Словники та асоціативні масиви. Широко використовуються реалізації структур даних, що представляють словники чи асоціативні масиви, де ключі пов'язані з відповідними значеннями. Це забезпечує швидкий доступ до даних за ключем.
  • Кешування.Використовуються в кешах для швидкого доступу до даних, які часто запитуються. Кеші допомагають прискорити операції, запобігаючи повторним обчисленням або запитам до бази даних.
  • Розподіл ресурсів. Можуть використовуватися для керування ресурсами, такими як потоки даних, мережеві з'єднання або пам'ять, забезпечуючи рівномірний розподіл та швидкий доступ до них.
  • Перевірка унікальності.
  • Індексація бази даних. Бази даних використовують хеш-таблиці для індексування даних, що прискорює виконання запитів та пошук записів.

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

Лавинний ефект

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

Застосування лавинного ефекту:

  • Захист даних. Лавинний ефект забезпечує високий рівень безпеки даних. Найменші зміни даних або паролів викликають кардинальні зміни у відповідних хеш-значеннях. Це ускладнює завдання зловмисникам, які намагаються зламати паролі або змінити дані.
  • Цифровий підпис. У цифрових підписах хеш-значення використовуються для гарантії автентичності та цілісності повідомлень та документів.Лавинний ефект забезпечує, що навіть незначні зміни в тексті, який підписується документом, призводять до значних змін у хеш-значенні, що забезпечує надійність виявлення підробок.
  • Хеш-таблиці та пошук даних. У хеш-таблицях лавинний ефект гарантує рівномірний розподіл ключів по осередках, що покращує продуктивність пошуку даних.

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

Хеш пароля

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

Основи хешування паролів:

  • Сіль (Salt). Щоб зробити паролі більш захищеними, ми використовуємо випадкові символи (сіль), які додаємо до пароля, перш ніж його перетворити на інший код. Це допомагає запобігти атакам, коли зловмисники використовують заздалегідь підготовлені таблиці, і гарантує, що навіть якщо паролі однакові, їх коди будуть унікальними.
  • Ітерація. Для посилення захисту від атак на хеш-значення паролів, хеш-функція застосовується до пароля кілька разів. Цей процес називається ітераціями та збільшує час, необхідний для підбору пароля методом перебору. Розшифрувати хеш-пароль просто так не вдасться.
  • Двофакторна автентифікація. Додаткові методи аутентифікації, такі як надсилання одноразових кодів на мобільний телефон, посилюють безпеку паролів.

Хеш файлу

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

Основи хешування файлів:

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

Застосування хешування файлів:

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

Хеш-суми та їх використання для пошуку вірусів

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

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

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

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

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

PRO32 Ultimate Security є надійним і безпечним антивірусом нового покоління, який активно використовує різні алгоритми для ефективної боротьби з вірусами. Вони забезпечують швидке та точне виявлення шкідливих програм для високого рівня захисту користувачів.

Що таке хешування? Під капотом блокчейна

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

То що таке хешування?

Простими словами, хешування означає введення інформації будь-якої довжини та розміру у вихідному рядку та видачу результату фіксованої довжини заданої алгоритмом функції хешування.У контексті криптовалют, таких як Біткоїн, транзакції після хешування на виході виглядають як набір символів певної алгоритмом довжини (Біткоїн використовує SHA-256).


Input - дані, що вводяться, hash - хеш

Подивимося, як працює процес хешування. Ми збираємось внести певні дані. Для цього ми будемо використовувати SHA-256 (безпечний алгоритм хешування із сімейства SHA-2, розміром 256 біт).

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

Криптографічні хеш-функції

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

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

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

Властивість 3: Складність зворотного обчислення
Складність зворотного обчислення означає, що з урахуванням H (A) неможливо визначити A, де A – дані, що вводяться, і H(А) – хеш. Зверніть увагу на використання слова "неможливо" замість слова "неможливе". Ми вже знаємо, що визначити вихідні дані щодо їхнього хеш-значенню можна. Візьмемо приклад.

Припустимо, ви граєте в кістки, а підсумкове число - це хеш числа, яке з'являється з кістки. Як визначити, що таке вихідний номер? Просто все, що вам потрібно зробити, це знайти хеші всіх чисел від 1 до 6 і порівняти. Оскільки хеш функції детерміновані, хеш конкретного номера завжди буде одним і тим же, тому ви можете просто порівняти хеш і дізнатися вихідний номер.

Але це працює тільки тоді, коли цей обсяг даних дуже малий. Що відбувається, коли ви маєте величезний обсяг даних? Припустимо, ви маєте справу зі 128-бітним хешом. Єдиний метод, за допомогою якого ви повинні знайти вихідні дані, це метод «грубою сили». Метод «грубої сили» означає, що вам потрібно вибрати випадкове введення, хешувати його, а потім порівняти результат з досліджуваним хешом і повторити, поки не знайдете збігу.

Отже, що станеться, якщо ви використовуєте цей метод?

  • Найкращий сценарій: ви отримуєте свою відповідь за першої ж спроби. Ви дійсно повинні бути найщасливішою людиною у світі, щоб це сталося. Імовірність такої події незначна.
  • Найгірший сценарій: ви отримуєте відповідь після 2^128 - 1 раз. Це означає, що ви знайдете свою відповідь в кінці всіх обчислень даних (один шанс з 340282366920938463463374607431768211456)
  • Середній сценарій: ви знайдете його десь посередині, тому переважно після 2 ^ 128/2 = 2 ^ 127 спроб. Іншими словами, це величезна кількість.

Властивість 4: Невеликі зміни у введених даних змінюють хеш
Навіть якщо ви внесете невеликі зміни до вихідних даних, зміни, які будуть відображені в хеш, будуть величезними. Давайте перевіримо за допомогою SHA-256:

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

Властивість 5: Колізійна стійкість
Враховуючи два різних типи вихідних даних A і B, де H (A) і H (B) є їх відповідними хешами, для H (A) не може дорівнювати H (B). Це означає, що здебільшого кожен вхід матиме свій власний унікальний хеш. Чому ми сказали «здебільшого»? Поговоримо про цікаву концепцію під назвою «Парадокс дня народження».

Що таке феномен дня народження?
Якщо ви випадково зустрічаєте незнайомця на вулиці, шанс, що у вас збігатимуться дати днів народження, дуже малий. Фактично, якщо припустити, що всі дні року мають таку ж ймовірність дня народження, шанси іншої людини, яка розділяє ваш день народження, становлять 1/365 або 0,27%. Іншими словами, він справді низький.

Однак, наприклад, якщо зібрати 20-30 осіб в одній кімнаті, шанси двох людей, які поділяють той же день, різко зростає. Насправді, шанс для 2 осіб 50-50, які поділяють той же день народження за такого розкладу.

Як це застосовується у хешуванні?
Припустимо, у вас є 128-розрядний хеш, який має 2 ^ 128 різних ймовірностей. Використовуючи день народження парадокс, у вас є 50% шанс розбити колізійну стійкість sqrt (2 ^ 128) = 2 ^ 64.

Як ви помітили, набагато легше зруйнувати колізійну стійкість, ніж знайти зворотне обчислення хешу. Для цього зазвичай потрібно багато часу.Отже, якщо ви використовуєте таку функцію, як SHA-256, можна з упевненістю припустити, що якщо H(A) = H(B), то A=B.

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

Для кожного виходу «Y», якщо k вибраний з розподілу з високою мінентропією, неможливо знайти вступні дані x такі, що H (k | x) = Y.

Ймовірно, це вище вашого розуміння! Але все гаразд, давайте тепер розберемося з цим визначенням.

У чому сенс «високої мінентропії»?
Це означає, що розподіл, з якого вибрано значення, розосереджено так, що ми вибираємо випадкове значення, що має незначну ймовірність. В принципі, якщо вам сказали вибрати число від 1 до 5, це низький розподіл мінентропії. Однак, якби ви обрали число від 1 до нескінченності, це високий розподіл мінентропії.

Що означає «к|х»?
«|» позначає конкатенацію. Конкатенація означає поєднання двох рядків. Наприклад. Якби я об'єднала «блакитне» та «небо», то результатом було б «блакитне небо».
Отже, повернімося до визначення.

Припустимо, у вас є вихідне значення Y. Якщо ви вибираєте випадкове значення "К", неможливо знайти значення X, таке, що хеш конкатенації з K і X, видасть в результаті Y.

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

Приклади криптографічних хеш-функцій:

  • MD 5: Він виготовляє 128-бітний хеш. Колізійна стійкість була зламана після ~2^21 хеша.
  • SHA 1: створює 160-бітовий хеш.Колізійна стійкість була зламана після ~2^61 хеша.
  • SHA 256: створює 256-бітовий хеш. В даний час використовується в Біткоїні.
  • Keccak-256: Створює 256-бітний хеш і зараз використовується Ефіріум.

1. Покажчики
2. Пов'язані списки

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

Наприклад, запис int a = 10 означає, що існує певна змінна «a», що зберігає в собі ціле значення 10. Так виглядає стандартна змінна.

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

Пов'язані списки
Пов'язаний список є одним із найважливіших елементів у структурах даних. Структура зв'язаного списку виглядає так:


*Head - заголовок; Data – дані; Pointer – покажчик; Record – запис; Null – нуль

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

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

Перший блок називається «блоком генези», яке покажчик перебуває у самій системі. Виглядає це так:


*H ( ) – Хешовані покажчики зображуються таким чином

Якщо вам цікаво, що означає «хеш-покажчик», ми з радістю пояснимо.
Як ви вже зрозуміли, саме на цьому ґрунтується структура блокчейна. Ланцюжок блоків є пов'язаним списком. Розглянемо, як улаштована структура блокчейна:


* Hash of previous block header – хеш попереднього заголовка блоку; Merkle Root - Корінь Меркла; Transactions – транзакції; Simplified Bitcoin Blockchain - Спрощений блокчейн Біткоїна.

Блокчейн являє собою пов'язаний список, що містить дані, а також покажчик хешування, що вказує на попередній блок, створюючи таким чином зв'язковий ланцюжок. Що таке хеш-покажчик? Він схожий на звичайний покажчик, але замість того, щоб просто утримувати адресу попереднього блоку, він також містить хеш даних, що знаходяться всередині попереднього блоку. Саме це невелике налаштування робить блокчейн настільки надійним. Уявімо на секунду, що хакер атакує блок 3 і намагається змінити дані. Через властивості хеш-функцій навіть невелика зміна даних сильно змінить хеш. Це означає, що будь-які незначні зміни, вироблені в блоці 3 змінять хеш, що зберігається в блоці 2, що, у свою чергу, змінить дані і хеш блоку 2, а це призведе до змін в блоці 1 і так далі. Ланцюжок буде повністю змінено, а це неможливо. Але як виглядає заголовок блоку?


* Prev_Hash - попередній хеш; Tx – транзакція; Tx_Root - корінь транзакції; Timestamp – тимчасова відмітка; Nonce є унікальним символом.

Заголовок блоку складається з наступних компонентів:

· Версія: номер версії блоку
· Час: поточна тимчасова мітка
· Поточна складна мета (Див. нижче)
· Хеш попереднього блоку
· Унікальний символ (Див. нижче)
· Хеш кореня Меркла

Прямо зараз, давайте зосередимося на тому, що собою являє хеш кореня Меркла.Але перш нам необхідно розібратися з поняттям Дерева Меркла.

Що таке Дерево Меркла?

Джерело: Wikipedia

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

Листовий вузол: Листові вузли є вузлами в нижньому ярусі дерева. Тому, за наведеною вище схемою, листовими будуть вважатися вузли L1, L2, L3 і L4.

Дочірні вузли: Для вузла всі вузли, що знаходяться нижче за його рівень і які входять до нього, є його дочірніми вузлами. На діаграмі вузли з написом «Hash 0-0» та «Hash 0-1» є дочірніми вузлами вузла з написом «Hash 0».

Кореневий вузол: єдиний вузол, що знаходиться на найвищому рівні, з написом Top Hash є кореневим.

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

Давайте подивимося на приклад на наступному Хеш-дереві:


Зображення надане проектом: Coursera

Тепер припустимо, я хочу дізнатися, належать ці дані блоку чи ні:

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


Це значно скорочує час.

Хешування у майнінгу: крипто-головоломки.
Коли ми говоримо «майнінг», це в основному означає пошук нового блоку, який буде додано до блокчейну. Майнери всього світу постійно працюють над тим, щоб переконатися, що ланцюжок продовжує зростати. Раніше людям було простіше працювати, використовуючи для майнінгу лише свої ноутбуки, але згодом вони почали формувати пули, об'єднуючи при цьому потужність комп'ютерів і майнерів, що може стати проблемою. Існують обмеження для кожної криптовалюти, наприклад, для біткоїну вони становлять 21 мільйон. Між створенням кожного блоку має бути певний часовий інтервал, заданий протоколом. Для біткоїну час між створенням блоку займає лише 10 хвилин. Якби блокам було дозволено створюватися швидше, це призвело б до:

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

Процес Майнінгу

Примітка: у цьому розділі ми говоритимемо про вироблення біткоїнів.
Коли протокол Біткоіна хоче додати новий блок у ланцюжок, майнінг – це процедура, якою він дотримується. Щоразу, коли з'являється новий блок, весь вміст спочатку хешується. Якщо підібраний хеш більше або дорівнює встановленому протоколом рівню складності, він додається до блокчейну, а всі у спільноті визнають новий блок.

Однак це не так просто. Ви повинні дуже пощастить, щоб отримати новий блок таким чином. Адже саме тут надається унікальний символ. Унікальний символ (nonce) – це одноразовий код, який поєднаний із хешом блоку.Потім цей рядок знову змінюється і порівнюється з рівнем складності. Якщо він відповідає рівню складності, то випадковий код змінюється.

• Виконується хеш вмісту нового блоку.
• До хешу додається nonce (спеціальний символ).
• Новий рядок знову хешується.
• Кінцевий хеш порівнюється з рівнем складності, щоб перевірити чи менше він його чи ні
• Якщо ні, nonce змінюється, і процес повторюється знову.
• Якщо так, то блок додається до ланцюжка, а загальнодоступна книга (блокчейн) оновлюється та повідомляє нодам про приєднання нового блоку.
• Майнери, відповідальні за цей процес, нагороджуються биткоинами.

Чи пам'ятаєте номер властивості 6 хеш-функцій?
Для кожного виходу Y, якщо k вибраний з розподілу з високою мінентропією, неможливо знайти вхід x таким чином, H (k | x) = Y.

Отже, коли справа доходить до майнінгу біткоїнів:

• К = Унікальний символ
• x = хеш блоку
• Y = мета проблеми

Весь процес абсолютно випадковий, заснований на генерації випадкових чисел, наступний протокол Proof Of Work і означає:

  • Вирішення завдань має бути складним.
  • Однак перевірка відповіді повинна бути простою для всіх.

Висновок


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

Подібні статті

  • Скільки Мегахешів видає 3090 Ti
  • Скільки проїжджає Volkswagen Поло
  • Скільки заробляють інженер у США
  • Скільки серій у серіалі Примара Прилучний
  • Скільки часу триває Камеральна перевірка 2022
  • Скільки років було Ахіллесу коли він помер
  • Скільки може прожити людина з виразкою шлунка
  • Скільки коштує Тексаред у таблетках
  • Останні статті

  • Який найвищий водоспад у Південній Америці
  • водоемульсійний лак
  • Який раціон має бути у вівчарки
  • Паливний насос високого тиску будова
  • скільки часу линяють качки
  • У чому плюс німецької вівчарки
  • гриби рядовки як приготувати
  • кімнатні рослини які не люблять світла
  • Категорії