Ich habe eine einfache Frage, die aufgetreten ist, als ich das Ergebnis eines SHA1-Hash in einer MySQL-Datenbank speichern wollte:
Wie lang sollte das VARCHAR- Feld sein, in dem ich das Hash-Ergebnis speichere?
Ich habe eine einfache Frage, die aufgetreten ist, als ich das Ergebnis eines SHA1-Hash in einer MySQL-Datenbank speichern wollte:
Wie lang sollte das VARCHAR- Feld sein, in dem ich das Hash-Ergebnis speichere?
Antworten:
Ich würde VARCHAR
für Daten mit variabler Länge verwenden, aber nicht mit Daten mit fester Länge. Da ein SHA-1-Wert immer 160 Bit lang ist, VARCHAR
würde nur ein zusätzliches Byte für die Länge des Feldes mit fester Länge verschwendet .
Und ich würde auch nicht den Wert speichern, den das SHA1
zurückgibt. Weil es nur 4 Bit pro Zeichen verwendet und somit 160/4 = 40 Zeichen benötigt. Wenn Sie jedoch 8 Bit pro Zeichen verwenden, benötigen Sie nur ein Feld mit einer Länge von 160/8 = 20 Zeichen.
Daher empfehle ich Ihnen, BINARY(20)
die UNHEX
Funktion zu verwenden, um den SHA1
Wert in binär umzuwandeln .
Ich habe die Speicheranforderungen für BINARY(20)
und verglichen CHAR(40)
.
CREATE TABLE `binary` (
`id` int unsigned auto_increment primary key,
`password` binary(20) not null
);
CREATE TABLE `char` (
`id` int unsigned auto_increment primary key,
`password` char(40) not null
);
Mit Millionen von Datensätzen binary(20)
dauert 44,56 Millionen , während char(40)
64,57 Millionen dauert.
InnoDB
Motor.
UNHEX()
manuell zum SQL hinzufügen.
Ein SHA1-Hash ist 40 Zeichen lang!
Unten finden Sie eine Liste der Hashing-Algorithmen sowie die erforderliche Bitgröße:
Erstellt eine Beispieltabelle mit erforderlichem CHAR (n):
CREATE TABLE tbl_PasswordDataType
(
ID INTEGER
,MD5_128_bit CHAR(32)
,SHA_160_bit CHAR(40)
,SHA_224_bit CHAR(56)
,SHA_256_bit CHAR(64)
,SHA_384_bit CHAR(96)
,SHA_512_bit CHAR(128)
);
INSERT INTO tbl_PasswordDataType
VALUES
(
1
,MD5('SamplePass_WithAddedSalt')
,SHA1('SamplePass_WithAddedSalt')
,SHA2('SamplePass_WithAddedSalt',224)
,SHA2('SamplePass_WithAddedSalt',256)
,SHA2('SamplePass_WithAddedSalt',384)
,SHA2('SamplePass_WithAddedSalt',512)
);
Die Länge liegt also zwischen 10 16-Bit-Zeichen und 40 Hexadezimalstellen.
Entscheiden Sie in jedem Fall, welches Format Sie speichern möchten, und legen Sie basierend auf diesem Format eine feste Größe für das Feld fest. Auf diese Weise haben Sie keinen Platz verschwendet.
Möglicherweise möchten Sie VARCHAR weiterhin verwenden, wenn Sie nicht immer einen Hash für den Benutzer speichern (z. B. Authentifizierung von Konten / vergessene Anmelde-URL). Sobald ein Benutzer seine Anmeldeinformationen authentifiziert / geändert hat, sollte er den Hash nicht mehr verwenden können und sollte keinen Grund dazu haben. Sie könnten eine separate Tabelle erstellen, um temporäre Hash-> Benutzerzuordnungen zu speichern, die gelöscht werden könnten, aber ich glaube nicht, dass sich die meisten Leute die Mühe machen, dies zu tun.
Wenn Sie einen Index für die Spalte sha1 benötigen, empfehle ich aus Leistungsgründen CHAR (40). In meinem Fall ist die Spalte sha1 ein E-Mail-Bestätigungstoken. Auf der Zielseite wird die Abfrage also nur mit dem Token eingegeben. In diesem Fall ist CHAR (40) mit INDEX meiner Meinung nach die beste Wahl :)
Wenn Sie diese Methode anwenden möchten, denken Sie daran, $ raw_output = false zu belassen.