A função MySQL SHA2 não parece funcionar
estou a usar o MySql 5.5.32 e a tentar reproduzir algum código num procedimento armazenado que temos na camada de negócio para poder definir senhas para as pessoas que usam sql
. Parece que há algo de errado com a função SHA2, mas talvez me esteja a escapar algo:
SELECT length(SHA2("bob", 512))
Devolve 128. Não deviam ser 64?
SELECT length(SHA2("bob", 256))
que devolve 64, por isso parece que me está a escapar alguma coisa, ou há um erro na SHA2. Alguma ideia?
3 answers
O comentário estava correcto, mesmo que os documentos digam que devolve uma string binária, devolve uma string codificada hexadecimal. Para obter a utilização correcta do comprimento:
Seleccione o tamanho (unhex (SHA2 ("bob", 512))
Codificei o patch para a função SHA2 () em 2005 e contribuí para o MySQL (os programadores editaram então o meu código um bit para corresponder aos seus padrões de codificação).
A função sempre devolveu uma sequência de dígitos hex, assim como todas as outras funções hash no MySQL.
Provavelmente está a ler esta declaração na documentação:
Consigo ver como um leitor pensaria que isto significa que devolve bytes binários, mas isso é uma má interpretação.A partir de MySQL 5.5.6, o valor de retorno é uma cadeia não-culinária no conjunto de caracteres de conexão. Antes de 5.5.6, o retorno o valor é uma string binária.
O que realmente significa isso é que a string tinha um conjunto binário de caracteres. Ainda é um texto simples de dígitos hex. Na verdade, nenhuma das funções de hash no MySQL devolve uma sequência de bytes como se você executasse o UNHEX() nele, todos eles devolvem cadeias de dígitos do hex. O comprimento de uma cadeia de dígitos hex é duas vezes o comprimento do equivalente bytes binários.
Se você não sabe que eu quero dizer com um conjunto binário de caracteres, veja O que é um conjunto binário de caracteres?
O SHA2 () foi alterado para usar o conjunto de caracteres de ligação em 5.5.6, enquanto outras funções de hash foram alteradas da mesma forma em 5.5.3.
A função SHA2(str, hash_ lentth) devolve um texto não normal. anteriormente a função SHA2
no MySQL devolveu um valor de uma cadeia binária.
A partir dos documentos no link que eu forneci:
A partir de MySQL 5.5.6, o valor de retorno é uma cadeia não culinária na conjunto de caracteres de ligação.
Podemos dissecar tudo isto através da seguinte SELECT
declaração:
SELECT SHA2("bob", 256) AS 'Hashed String',
UNHEX(SHA2("bob", 256)) AS 'Binary String',
LENGTH(UNHEX(SHA2("bob", 256))) AS 'Byte Count'
Que via a bancada de trabalho MySQL a saída irá resultado nisto:
Actualizar por Comentário:
A funçãoUNHEX(str) afirma na documentação que interpreta cada par de caracteres na sequência intrutada como números hexadecimais. Quanto a saber se a string de entrada é binária ou não, a documentação responde a essa pergunta para nós aqui:
Um resultado nulo pode ocorrer se o argumento do UNHEX () for uma coluna binária, porque os valores são preenchidos com 0x00 bytes quando armazenados, mas esses bytes não são despidos na recuperação.