Bene, l'ho capito e ho detto che avrei postato una risposta.
Il motivo per cui le password si sono presentate come hanno fatto è perché sono crittografate con una chiave pbkdf2
che è memorizzata in una posizione di portachiavi specifica (di solito con il nome "Chrome" al suo interno). Per trovare questa chiave puoi eseguire il comando security find-generic-password -wa 'Chrome'
come amministratore e dovrebbe tirare la chiave per te.
Una volta che hai la chiave, per decrittografarla dovresti;
- Genera il IV (
python -c 'import sys;sys.stdout.write("20" * 16)'
- Ottieni il sale (110% di probabilità è
saltysalt
)
- Cripta la chiave trovata utilizzando
pbkdf2_hmac
afferrando i primi 16 caratteri ed esagoni la chiave crittografata ( python -c 'import binascii;import hashlib;key=hashlib.pbkdf2_hmac("sha1","<KEY>",b"saltysalt",1003)[:16];print binascii.hexlify(key)
)
- Base64 codifica la password crittografata e rimuove i primi tre caratteri (
python -c 'import base64;print base64.b64encode("ENCRYPTED_PASSWORD")[3:]'
)
- Decrittografa la crittografia con il seguente comando:
openssl enc -base64 -d -aes-128-cbc -v <IV> '<HEX KEY>' -K '<BASE64 ENCODED PASSWORD>'
.
Fortunatamente per te, ho creato una semplice funzione python per restituire la stessa cosa:
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
Nota: affinché funzioni correttamente, devi disporre delle credenziali amministrative per il computer su cui stai eseguendo.