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
Author: Grayson Kent, 2014-03-01

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))

 4
Author: bpeikes, 2014-03-01 22:42:35

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:

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.

Consigo ver como um leitor pensaria que isto significa que devolve bytes binários, mas isso é uma má interpretação.

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.

 4
Author: Bill Karwin, 2017-05-23 12:00:14

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:

enter image description here

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.

 4
Author: Derek W, 2014-03-03 20:37:50