SHA2() în MySQL

Criptare și hash MySQL 5.5+

Calculează suma de control SHA-2 (SHA-224, SHA-256, SHA-384 sau SHA-512) a unui text.

Sintaxă
SHA2(text, lungime_biti)

Ce face SHA2()

SHA2() calculează o sumă de control din familia SHA-2. Al doilea argument alege lungimea: 224, 256, 384 sau 512 biți (0 înseamnă tot 256). Rezultatul este un text hexazecimal: 64 de caractere pentru SHA-256, 128 pentru SHA-512.

Este înlocuitorul recomandat pentru MD5() și SHA1(). Pentru o lungime nepermisă, rezultatul este NULL, cu avertisment; pentru un argument NULL, tot NULL.

Parametri

Parametru Descriere
text Textul pentru care se calculează suma.
lungime_biti 224, 256, 384, 512 sau 0 (= 256).

Ce returnează

Un text hexazecimal sau NULL.

Exemple

Exemplul 1: Diferite lungimi

SELECT SHA2('abc', 224) AS sha224,
       LENGTH(SHA2('abc', 256)) AS lungime_256,
       LENGTH(SHA2('abc', 512)) AS lungime_512,
       SHA2('abc', 100) AS lungime_gresita;

Rezultat

+----------------------------------------------------------+-------------+-------------+-----------------+
| sha224                                                   | lungime_256 | lungime_512 | lungime_gresita |
+----------------------------------------------------------+-------------+-------------+-----------------+
| 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 |          64 |         128 | NULL            |
+----------------------------------------------------------+-------------+-------------+-----------------+
Warning (Code 1583): Incorrect parameters in the call to native function 'sha2'

Exemplul 2: Detectarea înregistrărilor duplicate

Suma de control a unui text lung poate fi indexată și comparată mult mai ușor decât textul întreg.

CREATE TABLE mesaje (id INT, text TEXT, suma CHAR(64));
INSERT INTO mesaje VALUES
  (1, 'Comanda a fost livrată în Iași.', SHA2('Comanda a fost livrată în Iași.', 256)),
  (2, 'Plata a fost confirmată.', SHA2('Plata a fost confirmată.', 256)),
  (3, 'Comanda a fost livrată în Iași.', SHA2('Comanda a fost livrată în Iași.', 256));

SELECT LEFT(suma, 12) AS inceput_suma, COUNT(*) AS aparitii, GROUP_CONCAT(id) AS id_uri
FROM mesaje
GROUP BY suma
ORDER BY aparitii DESC;

Rezultat

+--------------+----------+--------+
| inceput_suma | aparitii | id_uri |
+--------------+----------+--------+
| 07cee39eb5c4 |        2 | 1,3    |
| b475b70fef40 |        1 | 2      |
+--------------+----------+--------+

Greșeli frecvente

  • Salvezi parole doar cu SHA2(parola, 256). Fără „sare” și fără un algoritm lent, parolele simple se pot afla din tabele precalculate; folosește bcrypt sau Argon2 în aplicație.
  • Pui rezultatul într-o coloană prea scurtă. SHA-256 are 64 de caractere, SHA-512 are 128.

Comenzi înrudite

  • MD5(): Calculează suma de control MD5 a unui text (32 de cifre hexazecimale); eliminată din versiunile noi.
  • SHA1() și SHA(): Calculează suma de control SHA-1 a unui text (40 de cifre hexazecimale); eliminată din versiunile noi.
  • AES_ENCRYPT() și AES_DECRYPT(): Criptează și decriptează date cu algoritmul AES; fără cheie, datele nu pot fi citite.