Are there any one-way hashing functions available in native JavaScript?

前端 未结 4 1428
滥情空心
滥情空心 2020-12-13 09:39

I\'d like to be able to create unique tokens* for users based on a hashed string. I know I could, for example, use a md5() library but as the purpose is not cryptographic I

相关标签:
4条回答
  • 2020-12-13 09:40

    In 2020, there is a native API:

    SubtleCrypto.digest()

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

    example:

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

    hex string conversion:

    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)

    0 讨论(0)
  • 2020-12-13 09:52

    Nothing is available in native JavaScript. You could use something like Murmurhash. There's a JavaScript implementation here: https://github.com/garycourt/murmurhash-js. I haven't used it though so can't vouch for it.

    Update: now there are multiple Murmurhash3 implementations available in JavaScript. However, many of them have problems encoding strings to bytes and can produce different results compared to the reference C++ implementation. You can read an analysis on this here, the murmurhash3js-revisited library implements all three variants of the function and conforms to the reference.

    0 讨论(0)
  • 2020-12-13 09:55

    JavaScript does not have native hashing, but there are many libraries.

    I recommend crypto-js: https://code.google.com/p/crypto-js/

    For example, to use SHA1, you simply:

    <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>
    
    0 讨论(0)
  • 2020-12-13 10:04

    Over the horizon, this may be possible with the currently experimental Web Crypto API

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

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

    Granted, at the time of this writing it is unrealistic to use in a production environment and will likely be a moving target. However, come 5 years who knows?

    0 讨论(0)
提交回复
热议问题