Los passwords en sistemas Linux/UNIX se guardan en el archivo /etc/shadow con el siguiente formato:
$ID$SALT$ENCRYPTED
- ID: Indica el tipo de cifrado
- SALT: Es un string aleatorio para aumentar la dificultad de un ataque de diccionario
- ENCRYPTED: Es el hash del password
Estos son los tipos hash utilizados comúnmente en Linux:
Tipo de Hash | ID | Longitud |
---|---|---|
MD5 | $1 | 22 |
bcrypt | $2b | 53 |
SHA-256 | $5 | 43 |
SHA-512 | $6 | 86 |
Generar hash desde Bash usando Python
Los siguientes ejemplos generan un hash para el password MySecretPassword:
MD5
python -c "import random,string,crypt; randomsalt = ''.join(random.sample(string.ascii_letters,8)); print crypt.crypt('MySecretPassword', '\$1\$%s\$' % randomsalt)" $1$YjOzcqrf$Zqx4sx5CQRuEIFCdOLAJV0
bcrypt / blowfish
# Usando 15 iteraciones python -c "import bcrypt; print(bcrypt.hashpw('MySecretPassword', bcrypt.gensalt(15)))" $2b$15$b1H.m7y98wLbv3XDtgFaLOB4Ak6DQGYqiihxbZWSBLx3QH1SekqHS
SHA-256
python -c "import random,string,crypt; randomsalt = ''.join(random.sample(string.ascii_letters,8)); print crypt.crypt('MySecretPassword', '\$5\$%s\$' % randomsalt)" $5$LgsPuaeR$OCtm.3tpbS/wyOZAIy6dsVNP4x0GyohyGebkIz15e88
SHA-512
python -c "import random,string,crypt; randomsalt = ''.join(random.sample(string.ascii_letters,8)); print crypt.crypt('MySecretPassword', '\$6\$%s\$' % randomsalt)" $6$EgITZWGD$5m1B7eWBH32Crj3COaT8.v3b4XFBvHVNcWMRLzoVkXHbmT6rC4Ot1uwuupYFHPLAoxMfXlB0LO8udusP2hnDp/