JSFiddle - React, Tailwind, and code Playground
JavaScript
function deriveAKey(password, salt, iterations, hash) {
// First, create a PBKDF2 "key" containing the password
window.crypto.subtle.importKey(
"raw",
stringToArrayBuffer(password),
{"name": "PBKDF2"},
false,
["deriveKey"]).
then(function(baseKey){
// Derive a key from the password
return window.crypto.subtle.deriveKey(
{
"name": "PBKDF2",
"salt": salt,
"iterations": iterations,
"hash": hash
},
baseKey,
{"name": "AES-GCM", "length": 256}, // Key we want.Can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC")
true, // Extractable
["encrypt", "decrypt"] // For new key
);
}).then(function(aesKey) {
// Export it so we can display it
return window.crypto.subtle.exportKey("raw", aesKey);
}).then(async function(keyBytes) {
// Display key in Base64 format
var keyS = arrayBufferToString(keyBytes);
var keyB64 = btoa (keyS);
console.log(keyB64);
console.log('Key byte size: ', byteCount(keyB64));
console.log('Key bit size: ', byteCount(keyB64) * 8);
var keyString = stringToArrayBuffer(keyB64);
const iv = window.crypto.getRandomValues(new Uint8Array(12));
const algorithm = {
name: 'AES-GCM',
iv: iv,
};
//Create CryptoKey for AES-GCM from import
const key = await crypto.subtle.importKey(
'raw',//Provided key will be of type ArrayBuffer
keyString,
{
name: "AES-GCM",
},
false,//Key not extractable
['encrypt', 'decrypt']
);
//Convert data to ArrayBuffer
const dataArrayBuffer = new...