Это строка Base64? Как я могу сказать, какая кодировка используется? - PullRequest
6 голосов
/ 30 ноября 2010

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

Я использую программное обеспечение, которое хранит пароль в базе данных оракула.Поле пароля имеет тип 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, и именно поэтому я получаю странно выглядящую декодированную строку.

Есть идеи?

Ответы [ 2 ]

13 голосов
/ 30 ноября 2010

На самом деле это кодировка 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 в секунду.

6 голосов
/ 30 ноября 2010

Пока 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), такая соль может быть случайной строкой, сохраненной в базе данных на пользователя или, например, логином пользователя (то, что никогда не может быть изменено).

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