50 Stimmen

Gibt es Einweg-Hashing-Funktionen in nativem JavaScript?

Ich möchte in der Lage sein, eindeutige Token* für Benutzer auf der Grundlage einer gehashten Zeichenfolge zu erstellen. Ich weiß, ich könnte zum Beispiel eine md5()-Bibliothek verwenden, aber da der Zweck nicht kryptographisch ist, fragte ich mich, ob es etwas gab, das ich "out of the box" verwenden konnte. Gibt es irgendwelche Einweg-Hashing-Funktionen in nativem JavaScript?

*Mir ist klar, dass diese nicht unbedingt einzigartig sein werden. Ich bin in Ordnung mit einer kleinen Chance der Hash-Kollision.

22voto

Weihang Jian Punkte 6493

Im Jahr 2020 wird es eine eigene API geben:

SubtleCrypto.digest()

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest

Beispiel:

crypto.subtle
  .digest("SHA-256", new TextEncoder().encode("hello"))
  .then(console.log);

Umwandlung von Hexadezimalzeichenfolgen:

const digest = async ({ algorithm = "SHA-256", message }) =>
  Array.prototype.map
    .call(
      new Uint8Array(
        await crypto.subtle.digest(algorithm, new TextEncoder().encode(message))
      ),
      (x) => ("0" + x.toString(16)).slice(-2)
    )
    .join("");

digest({message: "hello"}).then(console.log)

12voto

Tero Niemi Punkte 1037

JavaScript verfügt nicht über natives Hashing, aber es gibt viele Bibliotheken.

Ich empfehle krypto-js : https://code.google.com/p/crypto-js/

Um zum Beispiel SHA1 zu verwenden, müssen Sie nur:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha1.js"></script>
<script>
    var hash = CryptoJS.SHA1("Message");
</script>

6voto

Tim Down Punkte 304837

In nativem JavaScript ist nichts verfügbar. Sie könnten etwas verwenden wie Murmurhash . Hier gibt es eine JavaScript-Implementierung: https://github.com/garycourt/murmurhash-js . Ich habe es allerdings nicht benutzt, kann also nicht für es bürgen.

Update: Inzwischen gibt es mehrere Murmurhash3-Implementierungen in JavaScript. Viele von ihnen haben jedoch Probleme bei der Kodierung von Strings in Bytes und können im Vergleich zur C++-Referenzimplementierung unterschiedliche Ergebnisse liefern. Sie können Lesen Sie hier eine Analyse dazu die murmurhash3js-besucht Bibliothek implementiert alle drei Varianten der Funktion und stimmt mit der Referenz überein.

5voto

Adam Grant Punkte 11241

In naher Zukunft könnte dies mit der derzeit experimentellen Web Crypto API möglich sein

https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto

Zugegeben, zum Zeitpunkt der Erstellung dieses Artikels ist es unrealistisch, es in einer Produktionsumgebung zu verwenden, und es wird wahrscheinlich ein bewegliches Ziel sein. Aber in 5 Jahren, wer weiß?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X