O formato de um hash (o tamanho e o começo) já diz qual algoritmo o gerou.
Numa auditoria, a primeira coisa a fazer com um hash não é quebrá-lo: é reconhecer o que ele é. O formato entrega o algoritmo, e o algoritmo diz o quanto aquela senha resiste.
Os mais comuns:
Aparência
Algoritmo
Observação
32 símbolos hex
MD5
rápido, antigo, não use para senha
40 símbolos hex
SHA-1
rápido, quebrado, não use para senha
64 símbolos hex
SHA-256
rápido; bom para integridade, não para senha sozinho
começa com $2b$ (ou $2a$, $2y$)
bcrypt
lento e com sal, bom para senha
começa com $6$
sha512crypt
com sal, aceitável
começa com $argon2
Argon2
lento e com sal, recomendado
"Hex" são os símbolos de 0 a 9 e de a a f. Os que começam com $ trazem o esquema, o custo e o sal embutidos, separados por $. Por exemplo, $2b$12$... é bcrypt com custo 12.
Pelo tamanho e pelo começo: 32 hex é MD5, 40 é SHA-1, 64 é SHA-256; e o que começa com cifrão traz o esquema embutido, como bcrypt ou Argon2.
Em Python, len(h) == 32 e só com símbolos hex sugere MD5; h.startswith("$2b$") sugere bcrypt. Reconhecer o formato ordena o trabalho: os hashes rápidos e sem sal (MD5, SHA-1) caem a ataques de dicionário em segundos; os lentos e com sal (bcrypt, Argon2) resistem muito mais.