The SubtleCrypto.digest() method returns a Promise of a digest generated from the hash function and text given as parameters.

Note: Older insecure hash functions, like MD5, are not supported by this method. Even a supported method, SHA-1, is considered weak and should be avoided for cryptographic applications.


var hash = crypto.subtle.digest(algo, buffer);


  • algo is a DOMString defining the hash function to use. Supported values are: SHA-1, SHA-256, SHA-384, and SHA-512.
  • buffer is a ArrayBuffer or an ArrayBufferView containing the data to be hashed using the hashing algorithm.

Return value

  • hash is a Promise that returns the hash on success.


Here's an example that computes the sha256 of a string and display its hex digest.

function sha256(str) {
  // We transform the string into an arraybuffer.
  var buffer = new TextEncoder("utf-8").encode(str);
  return crypto.subtle.digest("SHA-256", buffer).then(function (hash) {
    return hex(hash);

function hex(buffer) {
  var hexCodes = [];
  var view = new DataView(buffer);
  for (var i = 0; i < view.byteLength; i += 4) {
    // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)
    var value = view.getUint32(i)
    // toString(16) will give the hex representation of the number without padding
    var stringValue = value.toString(16)
    // We use concatenation and slice for padding
    var padding = '00000000'
    var paddedValue = (padding + stringValue).slice(-padding.length)

  // Join all the hex strings into one
  return hexCodes.join("");

sha256("foobar").then(function(digest) {
}); // outputs "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2"

And an example using async/await.

async function sha256(message) {
    const msgBuffer = new TextEncoder('utf-8').encode(message);                     // encode as UTF-8
    const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);            // hash the message
    const hashArray = Array.from(new Uint8Array(hashBuffer));                       // convert ArrayBuffer to Array
    const hashHex = => ('00' + b.toString(16)).slice(-2)).join(''); // convert bytes to hex string
    return hashHex;

sha256('abc').then(hash => console.log(hash));

const hash = await sha256('abc');


Specification Status Comment
Web Cryptography API
The definition of 'SubtleCrypto.digest()' in that specification.
Candidate Recommendation Initial definition.

Browser compatibility

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support (SHA-1 and SHA-2 algorithms) 37 34 (34) No support ? No support
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (SHA-1 and SHA-2 algorithms) (Yes) 37 (Yes) 34.0 (34) No support ? No support

See also

Document Tags and Contributors

 Last updated by: chrisveness,