Я пытаюсь понять формат теневой строки linux и преобразовать строку в общий шестнадцатеричный формат, так же, как обычно представляется MD5.

Я следовал за определениями здесь http://www.akkadia.org/drepper/SHA-crypt.txt

Как описано, заключительным этапом (этап 22) является специальное кодирование base-64 с переупорядоченными байтами.

Я написал скрипт Python (моя первая программа на Python) для декодирования base64, а затем вернул его в исходный порядок.

Но ПРОБЛЕМА ЕСТЬ , результат - не та же строка, что и обычные хэши SHA1.

Например, пароль «123» (без кавычек) с солью «456» создаст теневую строку

$ 6 $ 456 $ yTSeWYNbvZDCsuZIN.Qdeg.0DxY5N1XddpO7qgFqjnZOqpy5QXIeMM7pdQYWIgu6Y3pSh5eYqJ21fqrlrjhJe /

С моей программой он генерирует

A922F952190B1ED9ADD9EFEDA918472364A10CABDBE79D7B5EA52A4FA6691B6A7648D429AB7BED45C7F7FE9938B8C0084F3025365C1FDC968A145192767D566A

Однако SHA512 хэш 123456 и 456123 являются

BA3253876AED6BC22D4A6FF53D8406C6AD864195ED144AB5C87621B6C233B548BAEAE6956DF346EC8C17F5EA10F35EE3CBC514797ED7DDD3145464E2A0BAB413

CA3D1DDE02C4B15D2E95521E259C5E08AAEA8FEAA722BA14014605249EFE3F248DB3D98AA7C4ACCBE887E1B40573D7EBA71017C5DF029C16C8D6F06B0FFDA310

Ни один из них не совпадает с моим результатом. Итак, есть ли что-то, что я неправильно понял в методе генерации теней? Или что-то не так с моим кодом?

Мой код на Python (входные данные должны быть кодом base64, то есть строкой после последнего "$" теневой строки):

#!/usr/bin/python
# filename: conv.py
import sys
b64s = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
bm = ( \
        (0,21,42), \
        (22,43,1), \
        (44,2,23), \
        (3,24,45), \
        (25,46,4), \
        (47,5,26), \
        (6,27,48), \
        (28,49,7), \
        (50,8,29), \
        (9,30,51), \
        (31,52,10), \
        (53,11,32), \
        (12,33,54), \
        (34,55,13), \
        (56,14,35), \
        (15,36,57), \
        (37,58,16), \
        (59,17,38), \
        (18,39,60), \
        (40,61,19), \
        (62,20,41), \
        ('*','*',63))

sd_str = raw_input('Enter a Shadow String: ')
ba = [0]*64
ba_org = [0]*64
for i in range (0,21):
        byte24 = 0
        for j in range(0,4):
                byte24 += (b64s.find(sd_str[i*4+j]) << (j*6))

        for j in range(0,3):
                ba[bm[i][2-j]] = ((byte24>>(j*8))&0x0000FF)

byte24 = b64s.find(sd_str[84]) + (b64s.find(sd_str[85])<<6)
ba[63] = byte24        #last byte
for i in range (0,64):
        sys.stdout.write('%02X' % ba[i])

sys.stdout.write('\n')
sys.stdout.flush()
2
Kevin Y. 23 Янв 2013 в 11:09

2 ответа

Лучший ответ

Самое большое, что вам не хватает, это то, что хэш пароля в теневом файле повторяется. Хеш-значение для пароля 123 не sha(password + salt), а sha(sha(sha(sha(password + salt) + salt) + salt)...), с 5000 уровнями вложенности по умолчанию.

2
duskwuff -inactive- 23 Янв 2013 в 07:24

Алгоритм "sha256_crypt" - это не просто хэш SHA256, это довольно сложная конструкция, которая сама по себе использует SHA256 в качестве криптографического примитива, отсюда и название.

Для значения округлений требуется не только несколько композиций функции SHA256, это даже не sha256(sha256(...)), но и гораздо более сложный цикл, с несколькими дополнительными этапами настройки заранее ... цель которого состоит в том, чтобы сделать его много больше подходит для хеширования пароля, чем просто sha256(). Тем не менее, транспонирование перед кодированием в base64 и пользовательская кодировка base64, на самом деле, не добавляют ничего с точки зрения безопасности, это просто делает боль больший для реализации.

Я бы посоветовал прочитать оставшуюся часть документа Akkdia.org, в котором точно описывается, как вычисляется теневой хэш. Кроме того, вы можете посмотреть на sha2_crypt .py в исходном коде проекта Passlib, который показывает, что вам нужно реализовать - ищите функцию raw_sha256_crypt(), это правильная отправная точка, хотя мясо находится в raw_sha_crypt(). Обратите внимание, что я связал вас с источником v1.5.3, потому что последняя версия (хотя и быстрее) также сложнее понять.

1
Eli Collins 23 Янв 2013 в 16:27