2010-11-30 20 views
6

¡Esto es un rompecabezas para mí y estoy realmente molesto porque no puedo resolverlo! Entonces, si alguien tiene algo de tiempo libre, quisiera aquí algunas sugerencias sobre cómo resolverlo.¿Es esta cadena Base64? ¿Cómo puedo saber cuál es la codificación utilizada?

Uso un software que almacena la contraseña en una base de datos de Oracle. El campo de contraseña es de tipo Varchar2 (100 char). Me parece que el software codifica las contraseñas y almacena la cadena codificada en la base de datos.

Mi contraseña es '1234' y la cadena codificada es 'cRDtpNCeBiql5KOQsKVyrA0sAiA ='. Todas las contraseñas en la base de datos tienen 28 caracteres de largo.

El rompecabezas que me he asignado a mí mismo es encontrar la codificación y/o encriptación de la cadena. Mi primer cheque estaba en Base64

Así que aquí es mi primera prueba en Python (libre):

>>> 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ᆲ 

,

Aquí es mi segunda prueba:

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

lo tanto, mi La primera idea es que esto no está codificado en Base64. Después de consultar Wikipedia (https://en.wikipedia.org/wiki/Base64), parece que las cadenas codificadas en Base64 no son de tamaño fijo. Mi segundo pensamiento es que la cadena fue encriptada y luego codificada en Base64 y es por eso que obtengo la cadena decodificada de aspecto extraño.

¿Alguna idea?

+0

podría ser la codificación base64 de un hash sha1 como 'len (base64.b16encode (base64.b64decode ('cRDtpNCeBiql5KOQsKVyrA0sAiA =')))' is '40'? –

+0

Me pregunto qué difícil sería descifrar (vale, no es realmente descifrar) el SHA1 hash en la contraseña ya que conozco todas las restricciones (longitud mínima, longitud máxima, alfa, mayúsculas, números, caracteres especiales, etc.) ... ¡Tal vez debería hacer otra pregunta! :) –

+0

Dan No entiendo por qué usas b16encode, ¿puedes explicarlo? –

Respuesta

13

En realidad está codificado en Base64. Sin embargo, no es la contraseña en sí la que está codificada, sino su hash SHA-1.

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

o versiones más recientes de Python:

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

Base64 codifica 3 bytes como 4 caracteres. Como tiene 27 caracteres con un relleno, puede ver que hay 20 bytes codificados (27*3/4). Cuando algo relacionado con la seguridad tiene una longitud de 20 bytes (o 160 bits), generalmente es un SHA-1. Cuando es de 16 bytes (128 bits), por lo general es MD5.

Por cierto, siempre es una buena idea agregar sal aleatoria a la mezcla para que dos contraseñas idénticas no sobresalgan en la base de datos. En Linux, el módulo crypt lo ayuda con eso y agrega algunas medidas de seguridad más.

Editar: para responder a otro comentario, es muy fácil obtener el original de la contraseña "encriptada".Hay una técnica que se hizo famosa hace unos años llamada Rainbow Tables. Incluso hay online versions de él. Simplemente escriba su hash en hexadecimal (7110eda4d09e062aa5e4a390b0a572ac0d2c0220) y le dará 1234 en un segundo.

+2

Lo que nos lleva a la pregunta, ¿qué software inseguro almacena contraseñas sin * any * salt? –

+0

'import hashlib' sería más apropiado (' idle' se queja de que 'sha' está en desuso). Aparte de eso, la respuesta es bastante buena, ¡gracias! –

+0

Matthew, el sistema almacena contraseñas sin sal y kickik el sistema se ejecuta en Linux. –

5

Mientras que len(decoded) = 20 entonces supongo que esto es hash SHA1 con codificación Base64.

Puede crear este tipo de contraseñas codificadas por:

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

En cuanto a dichos almacenar contraseñas: no es muy buena, mientras que muchas galletas pueden utilizar tablas "arco iris" con precomputed MD5, SHA1 y otros valores hash y que pueden obtener una contraseña basada en dicho hash. Para evitar que se use "sal": hash(salt+passwd), dicha sal puede ser una cadena aleatoria guardada en la base de datos por usuario o, por ejemplo, inicio de sesión de usuario (algo que nunca se puede cambiar).

+1

no como MD5 sería de 16 bytes de longitud, ya que es 20 es sha1 –

+0

por supuesto, gracias, cambió –

+0

Michal, su respuesta también es correcta. ¡Gracias por tu ayuda! –

Cuestiones relacionadas