NodeJS - crypto.subtle Property
The NodeJs Crypto.subtle is an instance and read-only property of the crypto interface. It is used to retrieve the subtle crypto which can be used to perform low-level cryptographic operations.
The SubtleCrypto is an interface in the NodeJs that provides several low-level cryptographic functions.
Cryptography operations are basic procedures used to protect information by transforming it into an unrecognizable form to somebody who cannot access it.
These operations include data encryption, data integrity, identity verification, information authentication, and non-repudiation.
Syntax
Following is the syntax of the NodeJs Crypto.subtle property −
Crypto.subtle
Parameters
- As it is property does not accept any parameter.
Return value
This property returns the SubtleCrypto interface.
Example 1
The following is the basic example of the NodeJs Crypto.subtle property.
const crypto = require('crypto').webcrypto;
const message = 'Hello, world!';
async function createHash(message) {
const encoder = new TextEncoder();
const data = encoder.encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return hashHex;
}
createHash(message).then(hash => console.log('SHA-256 hash of ', message, 'is: ', hash));
Output
The above program produces the following output −
SHA-256 hash of Hello, world! is: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
Example 2
The following is another example of the NodeJs Crypto.subtle property. We use this property to retrieve the CryptoSubtle to perform low-level cryptographic operations such as data encryption and decryption.
const { webcrypto } = require('crypto');
async function generateKey() {
return webcrypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
}
async function encryptData(data, key) {
const iv = webcrypto.getRandomValues(new Uint8Array(12));
const encryptedData = await webcrypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, new TextEncoder().encode(data));
return { iv, encryptedData: new Uint8Array(encryptedData) };
}
async function decryptData(encryptedData, iv, key) {
const decryptedDataBuffer = await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, encryptedData);
return new TextDecoder().decode(decryptedDataBuffer);
}
(async () => {
const key = await generateKey();
const data = 'Tutorialspoint!';
const { iv, encryptedData } = await encryptData(data, key);
console.log('Encrypted Data:', encryptedData);
const decryptedData = await decryptData(encryptedData, iv, key);
console.log('Decrypted Data:', decryptedData);
})();
Output
After executing the above program it will display the following output −
Encrypted Data: Uint8Array(31) [ 223, 193, 14, 42, 142, 251, 166, 92, 192, 167, 135, 65, 143, 66, 41, 20, 51, 227, 13, 10, 151, 81, 221, 140, 41, 183, 157, 1, 181, 252, 251 ] Decrypted Data: Tutorialspoint!