Tenho alguns arquivos de configuração do programa ELOG onde quero alterar a senha manualmente, usando algo como echo -n "newpassword" | sha256sum
mas o valor não é o hexa esperado. Aqui está um extrato de um desses arquivos:
<password encoding="SHA256">vyk1C6u3pcdfTIlvEFSdjvHBiymJBxUuvcZj3BR5Ol/</password>
Que comando posso usar para gerar um hash correto? Isso não está no formato correto:
$ echo -n "newpassword" | sha256sum
089542505d659cecbb988bb5ccff5bccf85be2dfa8c221359079aee2531298bb -
A senha toto
dá o hashbfvea3iDok9C0ptb022ndR2uWZUq0BIOH.cVQvSOMUA
É SHA256 bruto codificado com algo base64-ish. O comprimento corresponde a base64 de 32 bytes sem preenchimento.
SHA256 produz uma string de 32 bytes. Essa string geralmente é representada no formato hexadecimal (como 64 caracteres [0-9a-f]), mas não é um requisito. Pode-se optar por usar uma codificação diferente para tornar a string produzida mais curta.
Base64 pode codificar qualquer string de bytes de 8 bits em uma string que pode ser representada com caracteres ASCII com apenas 33% de sobrecarga de comprimento (em comparação com 100% de sobrecarga para hexadecimal).
Base64 é bastante simples: primeiro converte a string de bytes de 8 bits em bits, depois divide essa string em bytes de 6 bits. Esses bytes de 6 bits são então representados usando um alfabeto fixo que consiste, nesta ordem:
A-Z
(26 valores 000000..011001)a-z
(26 valores 011010..110011)0-9
(10 valores 110100..111101)+
e/
(111110, 111111)para um total de 64 caracteres para representar todos os valores possíveis de um byte de 6 bits. A string resultante é preenchida com um ou dois
=
caracteres para que o comprimento da string seja um múltiplo de 4. Muitas implementações não requerem o preenchimento para decodificação porque não carrega nenhuma informação.Seus hashes de exemplo têm 43 caracteres. Esse comprimento corresponde ao comprimento de base64 não preenchida de uma string de 32 bytes.
Mas não é tão simples com ELOG! Ao olhar para o código-fonte, você verá que ele usa um alfabeto base64 diferente :
.
e/
0-9
A-Z
a-z
Essa diferença pode ser facilmente contornada usando
tr
para mapear esses alfabetos. Mas mesmo assim os resultados ainda não coincidem. No seu exemplo, a stringtoto
produz o hashbfvea3iDok9C0ptb022ndR2uWZUq0BIOH.cVQvSOMUA
. Observe os dois caracteres idênticos consecutivos:A string
toto
codificada com o 'regular' SHA256+base64 não possui estes:Uma tradução simples preserva a semelhança, então deve haver algo mais em jogo aqui.
@KamilMaciorowski sugeriu em comentários que algum sal pode estar envolvido. Um salt criptográfico é uma string aleatória por usuário armazenada em texto simples que é anexada à senha antes do hash para que senhas idênticas usadas por usuários diferentes produzam hashes diferentes.
Você pode mergulhar mais fundo no código para descobrir se o sal é usado e como.