Está bien, lo descubrí y dije que publicaría una respuesta.
La razón por la que las contraseñas se mostraron como lo hicieron es porque están cifradas con una clave pbkdf2
que se almacena en una ubicación específica del llavero (generalmente con el nombre 'Chrome'). Para encontrar esta clave, puede ejecutar el comando security find-generic-password -wa 'Chrome'
como administrador y debería extraer la clave por usted.
Una vez que tengas la clave, para descifrarla necesitarás;
- Genera el IV (
python -c 'import sys;sys.stdout.write("20" * 16)'
- Obtenga la sal (110% de probabilidad es
saltysalt
)
- Cifre la clave encontrada usando
pbkdf2_hmac
, capturando los primeros 16 caracteres y hexlifique la clave cifrada ( python -c 'import binascii;import hashlib;key=hashlib.pbkdf2_hmac("sha1","<KEY>",b"saltysalt",1003)[:16];print binascii.hexlify(key)
)
- Base64 codifica la contraseña cifrada y elimina los primeros tres caracteres (
python -c 'import base64;print base64.b64encode("ENCRYPTED_PASSWORD")[3:]'
)
- Descifre el cifrado con el siguiente comando:
openssl enc -base64 -d -aes-128-cbc -v <IV> '<HEX KEY>' -K '<BASE64 ENCODED PASSWORD>'
.
Por suerte para ti, creé una función Python simple para devolver lo mismo:
import base64
import binascii
import subprocess
from hashlib import pbkdf2_hmac
def decrypt(encrypted, key):
iv = ''.join(('20', ) * 16)
key = pbkdf2_hmac('sha1', key, b'saltysalt', 1003)[:16]
hex_key = binascii.hexlify(key)
hex_enc_password = base64.b64encode(encrypted[3:])
try:
decrypted = subprocess.check_output(
"openssl enc -base64 -d "
"-aes-128-cbc -iv '{}' -K {} <<< "
"{} 2>/dev/null".format(iv, hex_key, hex_enc_password),
shell=True)
except subprocess.CalledProcessError:
decrypted = "n/a"
return decrypted
Ten en cuenta que para que funcione correctamente, debes tener las credenciales administrativas de la computadora en la que ejecutas esto.