Является ли эта строка Base64? Как я могу узнать, что такое кодировка?

Это головоломка для меня, и я очень раздражен, что я не могу ее решить! Итак, если у кого-то есть свободное время, я хотел бы предложить несколько предложений о том, как его решить!

Я использую программное обеспечение, которое хранит пароль в базе данных оракула. Поле пароля имеет тип Varchar2 (100 символов). Мне кажется, что программное обеспечение кодирует пароли и сохраняет закодированную строку в базе данных.

Мой пароль – «1234», а закодированная строка – «cRDtpNCeBiql5KOQsKVyrA0sAiA =». Все пароли в базе данных составляют 28 символов.

Головоломка, которую я назначил себе, – это найти кодировку и / или шифрование строки. Моя первая проверка была на Base64

Итак, вот мой первый тест на python (простаивание):

>>> import base64 >>> encoded = 'cRDtpNCeBiql5KOQsKVyrA0sAiA=' >>> decoded = base64.b64decode(encoded) >>> decoded 'q\x10\xed\xa4\xd0\x9e\x06*\xa5\xe4\xa3\x90\xb0\xa5r\xac\r,\x02 ' >>> print decoded qíᄂО*ᆬ䣐ᄚᆬrᆲ 

,

Вот мой второй тест:

 >>> myString = '1234' >>> encoded = base64.b64encode(myString) >>> encoded 'MTIzNA==' >>> decoded = base64.b64decode('MTIzNA==') >>> decoded '1234' 

Итак, моя первая мысль заключается в том, что это не кодировка Base64. После того, как я проверил википедию ( https://en.wikipedia.org/wiki/Base64 ), кажется, что строки с кодировкой Base64 не имеют фиксированного размера. Моя вторая мысль заключается в том, что строка была зашифрована, а затем закодирована в Base64, и именно поэтому я получаю странную строку с расшифровкой.

Есть идеи?

На самом деле это кодировка Base64. Тем не менее, это не сам пароль, который кодируется, а его хэш SHA-1.

 from sha import sha print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') print sha('1234').hexdigest() 

или для более новых версий Python:

 from hashlib import sha1 print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') print sha1('1234').hexdigest() 

Base64 кодирует 3 байта как 4 символа. Поскольку у вас есть 27 символов с одним дополнением, вы можете видеть, что есть 20 закодированных байтов ( 27*3/4 ). Когда что-то связанное с безопасностью составляет 20 байтов (или 160 бит), обычно это SHA-1. Когда это 16 байт (128 бит), это обычно MD5.

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

Изменить : ответить на другой комментарий – очень легко получить оригинал из «зашифрованного» пароля. Есть техника, которая прославилась несколько лет назад под названием «Радужные столы». Есть даже онлайн-версии . Просто введите свой хэш в гексагоне ( 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 ), и он даст вам 1234 секунды.

В то время как len(decoded) = 20 то я предполагаю, что это шейдер SHA1 с кодировкой Base64.

Вы можете создать такие закодированные пароли:

 import hashlib import base64 passwd = '1234' hp = base64.b64encode(hashlib.sha1(passwd).digest()) print hp print len(hp) 

Что касается такого хранения паролей: это не очень хорошо, хотя многие крекеры могут использовать таблицы «радуги» с предварительно вычисленными MD5, SHA1 и другими хэшами, и они могут получить пароль на основе такого хэша. Чтобы предотвратить его использование, необходимо использовать «соль»: hash(salt+passwd) , такая соль может быть случайной строкой, сохраненной в базе данных для каждого пользователя или, например, логином пользователя (что никогда не может быть изменено).