Как выглядит хеш sha512

Обновлено: 02.07.2024

DES(Unix)
IvS7aeT4NzQPM
Применяется в Linux и др. подобных ОС.
Длина: 13 символов.
Описание: первые 2 символа – это соль (случайные символы, в нашем примере солью является строка «Iv»), а затем – непосредственно хэш.

Domain Cached Credentials
Admin:b474d48cdfc4974d86ef4d24904cdd91
Применяется для кэширования паролей домена Windows.
Длина: 16 байт.
Алгоритм: MD4(MD4(Unicode($pass)).Unicode(strtolower($userna me)))

MD5(Unix)
$1$12345678$XM4P3PrKBgKNnTaqG9P0T/
Применяется в Linux и др. подобных ОС.
Длина: 34 символа.
Описание: хэш начинается с сигнатуры $1$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка «12345678″), еще один символ $, а затем – непосредственно хэш.

MD5(APR)
$apr1$12345678$auQSX8Mvzt.tdBi4y6Xgj.
Применяется в Linux и др. подобных ОС.
Длина: 37 символов.
Описание: хэш начинается с сигнатуры $apr1$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка «12345678″), еще один символ $, а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 2000 вызовов алгоритма MD5.

MD5(phpBB3)
$H$9123456785DAERgALpsri.D9z3ht120
Применяется в phpBB 3.x.x.
Длина: 34 символа.
Описание: хэш начинается с сигнатуры $H$, затем идет один символ (чаще всего это символ ’9′), затем идет соль (8 случайных символов, в нашем примере солью является строка «12345678″), а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 2048 вызовов алгоритма MD5.

MD5(WordPress)
$P$B123456780BhGFYSlUqGyE6ErKErL01
Применяется в WordPress.
Длина: 34 символа.
Описание: хэш начинается с сигнатуры $P$, затем идет один символ (чаще всего это символ ‘B’), затем идет соль (8 случайных символов, в нашем примере солью является строка «12345678″), а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 8192 вызовов алгоритма MD5

MySQL
606717496665bcba
Применяется в старых версиях MySQL.
Длина: 8 байт.
Описание: хэш состоит из двух DWORD’ов, каждый из которых не превышает значения 0x7fffffff.

MySQL5
*E6CC90B878B948C35E92B003C792C46C58C4AF40
Применяется в новых версиях MySQL.
Длина: 20 байт.
Алгоритм: SHA-1(SHA-1($pass))
Примечание: в программу нужно загружать хэши без звездочки, которая стоит в начале хэшей.

RAdmin v2.x
5e32cceaafed5cc80866737dfb212d7f
Применяется в программе Remote Administrator v2.x.
Длина: 16 байт.
Алгоритм: пароль дополняется нулями до длины 100 байт и вся эта строка хэшируется алгоритмом MD5.

MD5
c4ca4238a0b923820dcc509a6f75849b
Применяется в phpBB v2.x, Joomla версии ниже 1.0.13, а также во многих других форумах и CMS.
Длина: 16 байт.
Алгоритм: соответствует функции md5() языка PHP.

md5($pass.$salt)
6f04f0d75f6870858bae14ac0b6d9f73:1234
Применяется в WB News, Joomla версии 1.0.13 и выше.
Длина: 16 байт.

md5($salt.$pass)
f190ce9ac8445d249747cab7be43f7d5:12
Применяется в osCommerce, AEF, Gallery и других CMS.
Длина: 16 байт.

md5(md5($pass))
28c8edde3d61a0411511d3b1866f0636
Применяется в e107, DLE, AVE, Diferior, Koobi и других CMS.

md5(md5($pass).$salt)
6011527690eddca23580955c216b1fd2:wQ6
Применяется в vBulletin, IceBB.
Длина: 16 байт.

md5(md5($salt).md5($pass))
81f87275dd805aa018df8befe09fe9f8:wH6_S
Применяется в IPB.
Длина: 16 байт.

md5(md5($salt).$pass)
816a14db44578f516cbaef25bd8d8296:1234
Применяется в MyBB.
Длина: 16 байт.

md5($salt.$pass.$salt)
a3bc9e11fddf4fef4deea11e33668eab:1234
Применяется в TBDev.
Длина: 16 байт.

md5($salt.md5($salt.$pass))
1d715e52285e5a6b546e442792652c8a:1234
Применяется в DLP.
Длина: 16 байт.

SHA-1
356a192b7913b04c54574d18c28d46e6395428ab
Применяется во многих форумах и CMS.
Длина: 20 байт.

sha1(strtolower($username).$pass)
Admin:6c7ca345f63f835cb353ff15bd6c5e052ec08e7a
Применяется в SMF.
Длина: 20 байт.

sha1($salt.sha1($salt.sha1($pass)))
cd37bfbf68d198d11d39a67158c0c9cddf34573b:1234
Применяется в Woltlab BB.
Длина: 20 байт.

SHA-256(Unix)
$5$12345678$jBWLgeYZbSvREnuBr5s3gp13vqi…
Применяется в Linux и др. подобных ОС.
Длина: 55 символов.
Описание: хэш начинается с сигнатуры $5$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка «12345678″), еще один символ $, а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 5000 вызовов алгоритма SHA-256.

SHA-512(Unix)
$6$12345678$U6Yv5E1lWn6mEESzKen42o6rbEm…
Применяется в Linux и др. подобных ОС.
Длина: 98 символов.
Описание: хэш начинается с сигнатуры $6$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка «12345678″), еще один символ $, а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 5000 вызовов алгоритма SHA-512.

Источники:
1. описание стандарта NIST FIPS PUB 180-4, "Secure Hash Standard (SHS)", U.S. Department of Commerce, март 2012

Термины:
FIPS Federal Information Processing Standard (Федеральный стандарт обработки информации).
SHA Secure Hash Algorithm (алгоритм стойкого хэширования).
Слово – беззнаковая переменная длиной 32 бита (4 байта), либо 64 бита (8 байт), зависит от выбранного SHA-алгоритма.

SECURE HASH STANDARD (семейство криптографических функций SHA-1 и SHA-2)

Семейство криптографических функций SHA делят на два подмножества: непосредственно алгоритм SHA-1 (опубликован в 1995 году – FIPS PUB 180-1) и ряд алгоритмов под общим названием SHA-2 (опубликован в 2002 году – FIPS PUB 180-2, обновлен в 2008 году - FIPS PUB 180-3): SHA-224, SHA-256, SHA-384, SHA-512; в 2012 году в FIPS PUB 180-4 добавлены алгоритмы SHA-512/224 и SHA-512/256. Мы рассмотрим стандарт FIPS PUB 180-4, объединяющий все семейство хэш-функций SHA-1 и SHA-2.

Алгоритмы различаются по размеру блоков и слов хэшируемых данных и хэш-значений – см. таблицу 1.

Функции

SHA-1 использует последовательность нелинейных функций f0 , f1 ,…, f79. Каждая функция ft, где 0 ≤ t < 79, оперирует тремя 32-битными переменными: x, y, и z, в результате возвращая одно 32-битное слово. В алгоритме SHA-1 используется следующий набор нелинейных функций ft (x, y, z):
00 ≤ t ≤ 19 Ch(x, y, z) = (x AND y) XOR ( NOT x AND z)
20 ≤ t ≤ 39 Parity(x, y, z) = x XOR y XOR z
40 ≤ t ≤ 59 Maj(x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)
60 ≤ t ≤ 79 Parity(x, y, z) = x XOR y XOR z

Булева алгебра.
Обратите внимание, что, например, функцию Ch может выразить по-другому:
z XOR (x AND (y XOR z))
Результат не изменится. В различных реализациях алгоритма такие варианты можно встретить.

SHA-224 и SHA-256 использует шесть нелинейных функций:

Ch(x, y, z) = (x AND y) XOR ( NOT x AND z)
Maj(x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)

Sigma0(x) = ROTR(x, 2) XOR ROTR(x, 13) XOR ROTR(x, 22)
Sigma1(x) = ROTR(x, 6) XOR ROTR(x, 11) XOR ROTR(x, 25)

Delta0(x) = ROTR(x, 7) XOR ROTR(x, 18) XOR SHR(x, 3)
Delta1(x) = ROTR(x, 17) XOR ROTR(x, 19) XOR SHR(x, 10)

SHA-384, SHA-512, SHA-512/224, SHA-512/384 использует шесть нелинейных функций:

Ch(x, y, z) = (x AND y) XOR ( NOT x AND z)
Maj(x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)

Sigma0(x) = ROTR(x, 28) XOR ROTR(x, 34) XOR ROTR(x, 39)
Sigma1(x) = ROTR(x, 14) XOR ROTR(x, 18) XOR ROTR(x, 41)

Delta0(x) = ROTR(x, 1) XOR ROTR(x, 8) XOR SHR(x, 7)
Delta1(x) = ROTR(x, 19) XOR ROTR(x, 61) XOR SHR(x, 6)

Константы

Константы Kt
00 ≤ t ≤ 19 0x5a827999
20 ≤ t ≤ 39 0x6ed9eba1
40 ≤ t ≤ 59 0x8f1bbcdc
60 ≤ t ≤ 79 0xca62c1d6

(Если вас заинтересовал вопрос, откуда взялись эти числа, то укажем их источник:
0x5A827999 = $\sqrt / 4$ , 0x6ED9EBA1 = $\sqrt / 4$ , 0x8F1BBCDC = $\sqrt / 4$ , 0xCA62C1D6 = $\sqrt / 4$ ; все умножено на 2 32 ).

64 константы (32-битные слова): K0 , K1 … K63. (Для любознательных: эти константы представляют собой первые 32 бита дробных частей кубических корней первых 64 простых чисел).

K = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
]

80 констант (64-битные слова): K0 , K1 … K79. (Для любознательных: эти константы представляют собой первые 64 бита дробных частей кубических корней первых 80 простых чисел).

K = [
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
]

Предварительная обработка

image00.jpg

image01.jpg

3. Установка инициализирующих значений

Перед процедурой вычисления хэша алгоритм устанавливает начальные значения H. Размер и количество слов H зависит от выбранного алгоритма.

Четыре 32-битных слова.
H0 = 0x67452301
H1 = 0xefcdab89
H2 = 0x98badcfe
H3 = 0x10325476
H4 = 0xc3d2e1f0

Восемь 32-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4)

Восемь 32-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19)

(Для любознательных: эти значения представляют собой первые 32 бита дробных частей квадратного корня простых чисел – порядковые номера чисел: первые 8).

Восемь 64-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17,
0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511,
0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4)

(Для любознательных: эти значения представляют собой первые 64 бита дробных частей квадратного корня простых чисел – порядковые номера чисел: с 9-го по 16-е).

Восемь 64-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179)

(Для любознательных: эти значения представляют собой первые 64 бита дробных частей квадратного корня простых чисел – порядковые номера чисел: первые 8).

"SHA-512/t" - общее название для t-битной хэш-функции на основе SHA-512, результат которой усекается до t бит. Каждый вариант t-битной хэш-функция требует различных инициализирующих значений. Для этого введена специальная процедура определения начальных значений для SHA-512/t конкретного варианта t.

Процедура определения начальных значений для SHA-512/t.
1. Берем начальные значения H из алгоритма SHA-512.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179)

2. Делаем следующие вычисления:
H0’ = H0 XOR 0xA5A5A5A5A5A5A5A5
H1’ = H1 XOR 0xA5A5A5A5A5A5A5A5
H2’ = H2 XOR 0xA5A5A5A5A5A5A5A5
H3’ = H3 XOR 0xA5A5A5A5A5A5A5A5
H4’ = H4 XOR 0xA5A5A5A5A5A5A5A5
H5’ = H5 XOR 0xA5A5A5A5A5A5A5A5
H6’ = H6 XOR 0xA5A5A5A5A5A5A5A5
H7’ = H7 XOR 0xA5A5A5A5A5A5A5A5

3. Считаем хэш от строки SHA-512("SHA-512/t") (где t может быть "224" или "256") c начальными значениями H’. Значение хэша и будет начальными значениями для алгоритма SHA-512/t:
H для SHA-512/224 = SHA512(H’, "SHA-512/224")
H для SHA-512/256 = SHA512(H’, "SHA-512/256")

Восемь 64-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x8C3D37C819544DA2, 0x73E1996689DCD4D6, 0x1DFAB7AE32FF9C82,
0x679DD514582F9FCF, 0x0F6D2B697BD44DA8, 0x77E36F7304C48942,
0x3F9D85A86A1D36C8, 0x1112E6AD91D692A1)

"SHA-512/t" - общее название для t-битной хэш-функции на основе SHA-512, результат которой усекается до t бит. Каждый вариант t-битной хэш-функция требует различных инициализирующих значений. Для этого введена специальная процедура определения начальных значений для SHA-512/t конкретного варианта t.

Процедура определения начальных значений для SHA-512/t.
1. Берем начальные значения H из алгоритма SHA-512.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179)

2. Делаем следующие вычисления:
H0’ = H0 XOR 0xA5A5A5A5A5A5A5A5
H1’ = H1 XOR 0xA5A5A5A5A5A5A5A5
H2’ = H2 XOR 0xA5A5A5A5A5A5A5A5
H3’ = H3 XOR 0xA5A5A5A5A5A5A5A5
H4’ = H4 XOR 0xA5A5A5A5A5A5A5A5
H5’ = H5 XOR 0xA5A5A5A5A5A5A5A5
H6’ = H6 XOR 0xA5A5A5A5A5A5A5A5
H7’ = H7 XOR 0xA5A5A5A5A5A5A5A5

3. Считаем хэш от строки SHA-512("SHA-512/t") (где t может быть "224" или "256") c начальными значениями H’. Значение хэша и будет начальными значениями для алгоритма SHA-512/t:
H для SHA-512/224 = SHA512(H’, "SHA-512/224")
H для SHA-512/256 = SHA512(H’, "SHA-512/256")

Восемь 64-битных слова.
H0, H1, H2, H3, H4, H5, H6, H7 = (
0x22312194FC2BF72C, 0x9F555FA3C84C64C2, 0x2393B86B6F53B151,
0x963877195940EABD, 0x96283EE2A88EFFE3, 0xBE5E1E2553863992,
0x2B0199FC2C85B8AA, 0x0EB72DDC81C52CA2)

Вычисление хэша

В алгоритме сложение "+" происходит по модулю 2 32 .

2. Инициализируем переменные a,b,c,d,e.
a = H0 (i-1)
b = H1 (i-1)
c = H2 (i-1)
d = H3 (i-1)
e = H4 (i-1)

3. Главный цикл функции сжатия
For t = 0 to 79
TEMP = ROTL(a, 5) + ft(b,c,d) + e + Wt + Kt
e = d
d = c
c = ROTL(b, 30)
b = a
a = TEMP

4. Считаем промежуточное хэш-значение
H0 (i) = (H0 (i-1) + a)
H1 (i) = (H1 (i-1) + b)
H2 (i) = (H2 (i-1) + c)
H3 (i) = (H3 (i-1) + d)
H4 (i) = (H4 (i-1) + e)
>

В алгоритме сложение "+" происходит по модулю 2 32 .

3. Главный цикл функции сжатия
For t = 0 to 63
TEMP1 = h + Sigma1(e) + Ch(e,f,g) + Wt + Kt
TEMP2 = Sigma0(a) + Maj(a,b,c)
h = g
g = f
f = e
e = d + TEMP1
d = c
c = b
b = a
a = TEMP1 + TEMP2

4. Считаем промежуточное хэш-значение
H0 (i) = (H0 (i-1) + a)
H1 (i) = (H1 (i-1) + b)
H2 (i) = (H2 (i-1) + c)
H3 (i) = (H3 (i-1) + d)
H4 (i) = (H4 (i-1) + e)
H5 (i) = (H5 (i-1) + f)
H6 (i) = (H6 (i-1) + g)
H7 (i) = (H7 (i-1) + h)
>

H0 (N) || H1 (N) || H2 (N) || H3 (N) || H4 (N) || H5 (N) || H6 (N) (7 слов * 32 бита = 224 бита)
Внимание: порядок байт в каждом слове "big-endian"

Алгоритм похож на SHA-256, только все переменные и слова – 64-битные.
В алгоритме сложение "+" происходит по модулю 2 64 .

3. Главный цикл функции сжатия
For t = 0 to 79
TEMP1 = h + Sigma1(e) + Ch(e,f,g) + Wt + Kt
TEMP2 = Sigma0(a) + Maj(a,b,c)
h = g
g = f
f = e
e = d + TEMP1
d = c
c = b
b = a
a = TEMP1 + TEMP2

4. Считаем промежуточное хэш-значение
H0 (i) = (H0 (i-1) + a)
H1 (i) = (H1 (i-1) + b)
H2 (i) = (H2 (i-1) + c)
H3 (i) = (H3 (i-1) + d)
H4 (i) = (H4 (i-1) + e)
H5 (i) = (H5 (i-1) + f)
H6 (i) = (H6 (i-1) + g)
H7 (i) = (H7 (i-1) + h)
>

H0 (N) || H1 (N) || H2 (N) || H3 (N) || H4 (N) || H5 (N) (6 слов * 64 бита = 384 бит)
Внимание: порядок байт в каждом слове "big-endian"

H0 (N) || H1 (N) || H2 (N) || первые 32 бита H3 (N) (3 слова * 64 бита + 32 бита = 224 бит)
Внимание: порядок байт в каждом слове "big-endian"

H0 (N) || H1 (N) || H2 (N) || H3 (N) (4 слова * 64 бита = 256 бит)
Внимание: порядок байт в каждом слове "big-endian"

На сегодняшний день, как никогда, актуальна проблема защиты информации и проверки её целостности. С каждым новым днём возрастает количество сайтов, программ, соцсетей и различных коммерческих структур, собирающих и хранящих данные своих пользователей. Каждый из нас должен быть уверен в том, что вводя свои персональные данные на каком-либо сайте, доступ к этим данным никто не получит. Как раз вопросом обеспечения безопасного хранения и проверки целостности данных активно занимается наука под названием криптография.

Криптографические методы широко применяются в задачах идентификации и аутентификации пользователей, защиты каналов связей от проникновения ложных данных, а также защиты электронных документов (различных форматов и типов) от незаконного распространения и подделывания. В данной статье хотелось бы рассмотреть и разобрать одни из популярных криптографических хеш-функций семейства SHA-2.

О хеш-функциях

Криптографическая хеш-функция представляет собой некоторый математический алгоритм, который преобразует последовательность данных произвольной длины в строку фиксированной длины, состоящей из ограниченного набора цифр и букв. Такие алгоритмы должны обладать рядом свойств:

Скорость вычисления хеш-функции должна быть быстрой;

Небольшие изменения в наборе данных должны приводить к абсолютно новому хеш-значению так, чтобы это значение не казалось связанным с предыдущим значением;

Сложность (невозможность) вычисления исходных данных по хеш-значению.

Наиболее частое применение хеш-функций - хранение хешированных паролей на стороне сервера. Это делается с той целью, чтобы никто не мог узнать оригинальный пароль и осуществить по нему вход в систему в случае получения доступа к базе. Хотя хеширование паролей не должно вызывать огромных проблем, но такое правило соблюдают не все компании, однако с каждым годом организации начинают больше заботиться о безопасности данных своих пользователей. Также многие компании защищают свои цифровые документы (музыку, фотографии, программы) при помощи вычисления хеш-суммы. В случае, если в программу был встроен вирус или документ был хоть немного изменен, контрольная сумма документа будет изменена и использование такого контента может сразу дать понять, что используются фальсифицированные данные.

Реализация алгоритмов семейства SHA-2

SHA-256

Первым делом реализуем битовые функции, которые будут использоваться в ходе хеширования, а именно: сложение (в случае алгоритма sha-256 сложение будет идти по модулю 2^32, в sha-512 по модулю 2^64), побитовое И, исключающее ИЛИ (xor), логический сдвиг вправо, циклический сдвиг вправо.

Примечания к реализации

В данных примерах для более легкого восприятия кода я работаю с битовой последовательность, как со строкой из 0 и 1. Все функции реализованы средствами посимвольного сравнения двух строк, содержащих только 0 и 1. В Python существуют уже готовые функции для битового сдвига (>>, <<) или для xor(^).

Теперь определим 8 констант, которые являются первыми 32 битами дробных частей квадратных корней первых восьми простых чисел:

Также заполним таблицу констант, которые являются первыми 32 битами кубических корней первых 64 простых чисел:

Примечание по коду

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

Для дальнейших вычислений хеш-значения одной 512-битовой части необходимо объявить еще несколько дополнительных переменных

Теперь можно реализовать основную часть алгоритма, которая будет выполняться 64 раза:

После цикла for k in range(64): необходимо выполнить последние преобразования для изменения переменных h0. h7, отвечающих за итоговое состояние хеш-функции:

После вычисления хеша для каждого 512-битного кусочка необходимо конкатенировать 16ричные значения всех переменных h0. h7:

На этом алгоритм SHA-256 можно считать реализованным, но хотелось рассмотреть другие алгоритмы из семейства SHA-2 и узнать, чем они все между собой отличаются.

SHA-224

Алгоритм SHA-224 в реализации полностью идентичен алгоритму SHA-256, но в качестве начальных значений h0..h7 берутся значения:

И при получении итогового хеша не используется значение h7 (за счет чего уменьшается длина полученного хеш-значения до 56 символов):

SHA-512

Отличия sha-512 от sha-256:

Слова имеют длину 64 бита;

Алгоритм хеширования проводится 80 раз, а не 64;

Используются кубические корни 80 первых простых чисел в отличии от 64 для sha-256;

Сдвиги, при вычислении дополнительных слов, происходят на другое число позиций;

Создается 64 дополнительных слова, а не 48;

Вычисление суммы ведется по mod 2^64.

Первым делом изменится метод перевода числа в бинарное представление:

И метод перевода строки в бинарное представление:

Цикл по чанкам предложения:

Генерация новых слов (изменился цикл, так же изменилось вычисление s0, s1):

Изменилось и основное тело функции, цикло повторяется 80 раз и сдвиги считаются по другому:

Как итог для функции sha-512 получаем:

SHA-512/256

SHA-512/256 идентичен SHA-512 за исключением того, что используются другие значения h0…h7 и при получении итогового хеша берутся только 256 левых бит результата:

SHA-512/224

SHA-512/224 идентичен SHA-512 за исключением того, что используются другие значения h0…h7 и при получении итогового хеша берутся 224 левых бита результата:

SHA-384

Аналогичен sha-512 за исключением того, что используются другие значения h0. h7 и опускаются значения h7, h6 при выводе итогового хеша:

Вывод

В данной статье были рассмотрены и реализованы алгоритмы семейства SHA-2. Эти алгоритмы используются в различных системах, например, в PGP — используются для создания электронной цифровой подписи; в DSA — используется для создания электронной цифровой подписи и во многих других системах для подтверждения подлинности документа, хеширования паролей, создания электронных цифровых подписей.

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Вычисляет хэш SHA512 для входных данных.

Примеры

В следующем примере выполняется вычисление SHA512 хэша для data и его сохранение в result . В этом примере предполагается, что существует предопределенная константа DATA_SIZE .

Комментарии

Хэш используется в качестве уникального значения фиксированного размера, представляющего большой объем данных. Хэши двух наборов данных должны совпадать только в том случае, если соответствующие данные также совпадают. Небольшие изменения данных приводят к большим непредсказуемым изменениям в хэше.

Размер хеша для SHA512 алгоритма составляет 512 бит.

Этот класс является абстрактным. Единственным реализацией этого класса является SHA512Managed .

Конструкторы

Инициализирует новый экземпляр SHA512.

Представляет размер вычисленного хэш-кода в битах.

Представляет значение вычисляемого хэш-кода.

Представляет состояние процесса вычисления хэша.

Свойства

Получает значение, указывающее на возможность повторного использования текущего преобразования.

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

Получает значение вычисленного хэш-кода.

Получает размер вычисленного хэш-кода в битах.

При переопределении в производном классе получает размер входного блока.

При переопределении в производном классе получает размер выходного блока.

Методы

Освобождает все ресурсы, используемые классом HashAlgorithm.

Вычисляет хэш-значение для заданного массива байтов.

Вычисляет хэш-значение для заданной области заданного массива байтов.

Вычисляет хэш-значение для заданного объекта Stream.

Асинхронно вычисляет хэш-значение для заданного объекта Stream.

Создает экземпляр реализации класса SHA512 по умолчанию.

Создает экземпляр заданной реализации класса SHA512.

Освобождает все ресурсы, используемые текущим экземпляром класса HashAlgorithm.

Освобождает неуправляемые ресурсы, используемые объектом HashAlgorithm, а при необходимости освобождает также управляемые ресурсы.

Определяет, равен ли указанный объект текущему объекту.

Служит хэш-функцией по умолчанию.

Возвращает объект Type для текущего экземпляра.

При переопределении в производном классе передает данные, записанные в объект, на вход хэш-алгоритма для вычисления хэша.

Передает записываемые в объект данные в хэш-алгоритм для вычисления хэша.

Вычисляет хэш данных с помощью алгоритма SHA512.

Вычисляет хэш данных с помощью алгоритма SHA512.

Вычисляет хэш данных с помощью алгоритма SHA512.

Если переопределено в производном классе, завершает вычисление хэша после обработки последних данных криптографическим хэш-алгоритмом.

Сбрасывает хэш-алгоритм в исходное состояние.

Создает неполную копию текущего объекта Object.

Возвращает строку, представляющую текущий объект.

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

Вычисляет хэш-значение для заданной области заданного массива байтов.

Пытается вычислить хэш-значение для заданного массива байтов.

Пытается вычислить хэш данных с помощью алгоритма SHA512.

Пытается завершить вычисление хэша после обработки последних данных хэш-алгоритмом.

Явные реализации интерфейса

Освобождает неуправляемые ресурсы, используемые объектом HashAlgorithm, а при необходимости освобождает также управляемые ресурсы.

Этичный хакинг и тестирование на проникновение, информационная безопасность

Что такое хеши и как они используются

Хеш-сумма (хеш, хеш-код) — результат обработки неких данных хеш-функцией (хеширования).

Это свойство хеш-функций позволяет применять их в следующих случаях:

Одним из применений хешов является хранение паролей. Идея в следующем: когда вы придумываете пароль (для веб-сайта или операционной системы) сохраняется не сам пароль, а его хеш (результат обработки пароля хеш-функцией). Этим достигается то, что если система хранения паролей будет скомпрометирована (будет взломан веб-сайт и злоумышленник получит доступ к базе данных паролей), то он не сможет узнать пароли пользователей, поскольку они сохранены в виде хешей. Т.е. даже взломав базу данных паролей он не сможет зайти на сайт под учётными данными пользователей. Когда нужно проверить пароль пользователя, то для введённого значения также рассчитывается хеш и система сравнивает два хеша, а не сами пароли.

По этой причине пентестер может столкнуться с необходимостью работы с хешами. Одной из типичных задач является взлом хеша для получения пароля (ещё говорят «пароля в виде простого текста» - поскольку пароль в виде хеша у нас и так уже есть). Фактически, взлом заключается в подборе такой строки (пароля), которая будет при хешировании давать одинаковое значение со взламываемым хешем.

Для взлома хешей используется, в частности, Hashcat. Независимо от выбранного инструмента, необходимо знать, хеш какого типа перед нами.

Как определить тип хеша

Существует большое количество хешей. Некоторые из них являются универсальными и применяются различными приложениями, например, MD5, SHA1, CRC8 и другие. Некоторые хеши применяются только в определённых приложениях (MySQL, vBulletin) и протоколами.

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

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

Пример такой строки для WinZip: $zip2$*0*3*0*b5d2b7bf57ad5e86a55c400509c672bd*d218*0**ca3d736d03a34165cfa9*$/zip2$

Пример строки для взлома пароля файла PDF 1.7 Level 8 (Acrobat 10 - 11): $pdf$5*6*256*-4*1*16*381692e488413f5502fa7314a78c25db*48*e5bf81a2a23c88f3dccb44bc7da68bb5606b653b733bcf9adaa5eb2c8ccf53abba66539044eb1957eda68469b1d0b9b5*48*b222df06deb308bf919d13447e688775fdcab972faed2c866dc023a126cb4cd4bbffab3683ecde243cf8d88967184680

Обычно пентестеру известен источник хеша и он знает его тип. Но бывают исключения. В этой ситуации необходимо «угадать» какой хеш перед нами.

Это можно сделать сравнивая исходный хеш с образцами. Либо исходя из количества символов и используемого набора символов.

Также можно использовать инструменты, которые значительно ускоряют этот процесс. Программами для определения типа хеша являются hashID и HashTag.

hashID

Эта программа по умолчанию уже установлена в Kali Linux. Она идентифицирует различные типы хешей, используемых для шифрования данных, в первую очередь, паролей.

hashID – это инструмент, написанный на Python 3, который поддерживает идентификацию более 220 уникальных типов хешей используя регулярные выражения.

Использование программы очень простое:

Пара важных замечаний:

  • хеш всегда лучше указывать в одинарных кавычках (а не без кавычек и не в двойных)
  • имеется опция -m, при использовании которой выводится информация о режиме Hashcat

Хеш режимы Hashcat – это условное обозначение типа хеша, которое необходимо указать с опцией -m, --hash-type.

К примеру, мне необходимо идентифицировать хеш $S$C33783772bRXEx1aCsvY.dqgaaSu76XmVlKrW9Qu8IQlvxHlmzLf:


Как можно увидеть по скриншоту, это Drupal > v7.x в Hashcat для взлома данного хеша необходимо указать режим 7900.

Идентифицируем хеш $1$VnG/6ABB$t6w9bQFxvI9tf0sFJf2TR.:

Получаем сразу несколько вариантов:


MD5cryp – это алгоритм, который вызывает тысячу раз стандартный MD5, для усложнения процесса.

Для справки: MD5 использовался для хеширования паролей. В системе UNIX каждый пользователь имеет свой пароль и его знает только пользователь. Для защиты паролей используется хеширование. Предполагалось, что получить настоящий пароль можно только полным перебором. При появлении UNIX единственным способом хеширования был DES (Data Encryption Standard), но им могли пользоваться только жители США, потому что исходные коды DES нельзя было вывозить из страны. Во FreeBSD решили эту проблему. Пользователи США могли использовать библиотеку DES, а остальные пользователи имеют метод, разрешённый для экспорта. Поэтому в FreeBSD стали использовать MD5 по умолчанию. Некоторые Linux-системы также используют MD5 для хранения паролей.

Ещё один хеш $6$q8C1F6tv$zTP/eEVixqyQBEfsSbTidUJfnaE2ojNIpTwTHava/UhFORv3V4ehyTOGdQEoFo1dEVG6UcXwhG.UHvyQyERz01:


Программа говорит, что это SHA-512 Crypt – т.е. SHA512 (Unix).

HashTag

HashTag – это инструмент на python, который разбирает и идентифицирует различные хеши паролей на основе их типа. HashTag поддерживает определение более 250 типов хешей и сопоставляет их с более чем 110 режимами hashcat. HashTag способен идентифицировать единичный хеш, разобрать единичный файл и определить хеши внутри него или обойти директорию и все поддиректории в поисках потенциальных файлов хешей и идентифицировать все найденные хеши.

Т.е. это аналогичная предыдущей программа.

По умолчанию в Kali Linux она отсутствует, поэтому требуется её скачать:

Идентифицируем те же самые хеши:




Как видим, результаты аналогичны.

Примеры хешей

Большое количество классических хешей, а также хешей, специально составленных для взлома пароля и хеш-файлов вы найдёте здесь.

На той странице вы можете:

  • попытаться идентифицировать свой хеш по образцам
  • найти ошибку в составленном хеше для взлома пароля, сравнив его с правильным форматом
  • проверить работу программ по идентификации хеша

Программы hashID и HashTag не всегда правильно идентифицируют хеш (по крайней мере, в явных ошибках замечена hashID).

К примеру, меня интересует хеш c73d08de890479518ed60cf670d17faa26a4a71f995c1dcc978165399401a6c4:53743528:


Это явно ошибочный результат, поскольку соль после двоеточия будто бы была отпрошена при идентификации хеша.

Получаем более правильный результат:


В действительности это sha256($pass.$salt).

Как рассчитать хеш (контрольную сумму)

В Linux имеются программы для расчёта и сверки популярных хешей:

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

Применение всех этих программ похожее – нужно указать имя файла, либо передать по стандартному вводу строку.

Если для расчёта хеша строки вы используете echo, то крайне важно указывать опцию -n, которая предотвращает добавление символа новой строки – иначе каждый хеш для строки будет неверным!

Пример подсчёта хеша SHA1 для строки test:

Ещё один способ передачи строки без добавления конечного символа newline

Этот же результат можно получить следующей конструкцией:

Программы для вычисления различных хешей

Кроме перечисленных встроенных в Linux утилит, имеются другие программы, способные подсчитывать контрольные суммы. Часто они поддерживают сразу несколько алгоритмов хеширования, могут иметь дополнительные опции ввода и вывода (поддерживают различные форматы и кодировки), некоторые из них подготовлены для выполнения аудита файловой системы (выявления несанкционированных изменений в файлах).

Список некоторых популярных программ для вычисления хешей:

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

Последовательное хеширование с использованием трубы (|)

Но это неправильный вариант. Поскольку результатом выполнения в любом случае является непонятная строка из случайных символов, трудно не только обнаружить ошибку, но даже понять, что она есть. А ошибок здесь сразу несколько! И каждая из них ведёт к получению абсолютно неправильных данных.

Даже очень бывалые пользователи командной строки Linux не сразу поймут в чём проблема, а обнаружив первую проблему не сразу поймут, что есть ещё одна.

Очень важно помнить, что в строке вместе с хешем всегда выводится имя файла, поэтому выполняя довольно очевидную команду вроде следующей:

Выше уже рассмотрено, как из вывода удалять « -», кажется, теперь всё должно быть в порядке:

Давайте разобьём это действие на отдельные команды:

Второй этап хеширования:

Это и есть правильный ответ.

Проблема в том, что когда выводится промежуточный хеш, к нему добавляется символ новой строки, и второй хеш считается по этой полной строке, включающей невидимый символ!

Используя printf можно вывести результат без конечного символа новой строки:

Результат вновь правильный:

С printf не все дружат и проблематично использовать рассмотренную конструкцию если нужно хешировать более трёх раз, поэтому лучше использовать tr:

Вновь правильный результат:

Или даже сделаем ещё лучше – с программой awk будем использовать printf вместо print (это самый удобный и короткий вариант):

Как посчитать итерированные хеши

Итерация – это повторное применение какой-либо операции. Применительно к криптографии, итерациями называют многократное хеширование данных, которые получаются в результате хеширования. Например, для исходной строки в виде простого текста рассчитывается SHA1 хеш. Полученное значение вновь хешируется – рассчитывается SHA1 хеш и так далее много раз.

Итерация – очень эффективный метод для борьбы с радужными таблицами и с полным перебором (брут-форсом), поэтому в криптографии итерированные хеши очень популярны.

Читайте также: