The SubtleCrypto.digest() method returns a Promise of a digest generated from the hash function and text given as parameters.
Warning: Older insecure hash functions, like MD5, are not supported by this method. Even a supported method, SHA-1, is considered weak, has been broken and should be avoided for cryptographic applications.
Syntax
var hash = crypto.subtle.digest(algo, buffer);
Parameters
algois aDOMStringdefining the hash function to use. Supported values are:SHA-1,SHA-256,SHA-384, andSHA-512.bufferis anArrayBufferor anArrayBufferViewcontaining the data to be hashed using the hashing algorithm.
Return value
hashis aPromisethat returns the hash on success.
Example
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)
hexCodes.push(paddedValue);
}
// Join all the hex strings into one
return hexCodes.join("");
}
sha256("foobar").then(function(digest) {
console.log(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 = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join(''); // convert bytes to hex string
return hashHex;
}
sha256('abc').then(hash => console.log(hash));
(async function() {
const hash = await sha256('abc');
}());
Specifications
| Specification | Status | Comment |
|---|---|---|
| Web Cryptography API The definition of 'SubtleCrypto.digest()' in that specification. |
Recommendation | Initial definition. |
Browser compatibility
| Feature | Chrome | Firefox (Gecko) | Edge | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
Basic support (SHA-1 and SHA-2 algorithms) |
37 | 34 (34) | (Yes) | 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
CryptoandCrypto.subtle.SubtleCrypto, the interface it belongs to.
Document Tags and Contributors
Tags:
Contributors to this page:
fhenneke,
programmer5000,
tophf,
bergus,
chrisveness,
abbycar,
teemuremes,
pstricker,
Sebastianz,
GaspardP,
ttaubert,
tOkeshu,
teoli,
mesh.a
Last updated by:
fhenneke,