Quellcode durchsuchen

Модуль с утилитами шифрования

Book Pauk vor 6 Jahren
Ursprung
Commit
091c50ec84
1 geänderte Dateien mit 66 neuen und 0 gelöschten Zeilen
  1. 66 0
      client/share/cryptoUtils.js

+ 66 - 0
client/share/cryptoUtils.js

@@ -0,0 +1,66 @@
+import {Buffer} from 'safe-buffer';
+
+//не менять
+const iv = Buffer.from('B6E2XejNh2dS');
+let aesKeys = {};
+
+export async function aesKeyFromPassword(password) {
+    return await window.crypto.subtle.importKey(
+        "raw", //only "raw" is allowed
+        Buffer.from(password), //your password
+        {
+            name: "PBKDF2",
+        },
+        false, //whether the key is extractable (i.e. can be used in exportKey)
+        ["deriveKey"] //can be any combination of "deriveKey" and "deriveBits"
+    ).then((key) => {
+        return window.crypto.subtle.deriveKey(
+            {
+                "name": "PBKDF2",
+                salt: Buffer.from('Liberama project is awesome'),//не менять
+                iterations: 1000,
+                hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
+            },
+            key, //your key from generateKey or importKey
+            { //the key type you want to create based on the derived bits
+                name: "AES-GCM", //can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC")
+                //the generateKey parameters for that type of algorithm
+                length: 256, //can be  128, 192, or 256
+            },
+            false, //whether the derived key is extractable (i.e. can be used in exportKey)
+            ["encrypt", "decrypt"] //limited to the options in that algorithm's importKey
+        );
+    });
+}
+
+export async function aesEncrypt(data, password) {
+    if (!aesKeys[password])
+        aesKeys[password] = await aesKeyFromPassword(password);
+
+    const key = aesKeys[password];
+
+    return await window.crypto.subtle.encrypt(
+        {
+            name: "AES-GCM",
+            iv
+        },
+        key, //from generateKey or importKey above
+        data //ArrayBuffer of data you want to encrypt
+    );
+}
+
+export async function aesDecrypt(data, password) {
+    if (!aesKeys[password])
+        aesKeys[password] = await aesKeyFromPassword(password);
+
+    const key = aesKeys[password];
+
+    return await window.crypto.subtle.decrypt(
+        {
+            name: "AES-GCM",
+            iv
+        },
+        key, //from generateKey or importKey above
+        data //ArrayBuffer of the data
+    );
+}