Поиск…


замечания

API WebCrypto обычно доступны только для «защищенных» источников, что означает, что документ должен быть загружен через HTTPS или с локального компьютера (из localhost , file: или расширения браузера).

Эти API-интерфейсы указаны в Рекомендации кандидата на получение W3C Web Cryptography API Candidate .

Криптографически случайные данные

// Create an array with a fixed size and type.
var array = new Uint8Array(5);

// Generate cryptographically random values
crypto.getRandomValues(array);

// Print the array to the console
console.log(array);

crypto.getRandomValues(array) может использоваться с экземплярами следующих классов (описанных далее в двоичных данных ) и будет генерировать значения из заданных диапазонов (оба конца включительно):

  • Int8Array : -2 7 to 2 7 -1
  • Uint8Array : от 0 до 2 8 -1
  • Int16Array : -2 15 до 2 15 -1
  • Uint16Array : от 0 до 2 16 -1
  • Int32Array : -2 31 to 2 31 -1
  • Uint32Array : от 0 до 2 31 -1

Создание дайджестов (например, SHA-256)

// Convert string to ArrayBuffer. This step is only necessary if you wish to hash a string, not if you aready got an ArrayBuffer such as an Uint8Array.
var input = new TextEncoder('utf-8').encode('Hello world!');

// Calculate the SHA-256 digest
crypto.subtle.digest('SHA-256', input)
// Wait for completion
.then(function(digest) {
  // digest is an ArrayBuffer. There are multiple ways to proceed.

  // If you want to display the digest as a hexadecimal string, this will work:
  var view = new DataView(digest);
  var hexstr = '';
  for(var i = 0; i < view.byteLength; i++) {
    var b = view.getUint8(i);
    hexstr += '0123456789abcdef'[(b & 0xf0) >> 4];
    hexstr += '0123456789abcdef'[(b & 0x0f)];
  }
  console.log(hexstr);

  // Otherwise, you can simply create an Uint8Array from the buffer:
  var digestAsArray = new Uint8Array(digest);
  console.log(digestAsArray);
})
// Catch errors
.catch(function(err) {
  console.error(err);
});

В текущем проекте предлагается предоставить, по меньшей мере, SHA-1 , SHA-256 , SHA-384 и SHA-512 , но это не является строгим требованием и может быть изменено. Тем не менее, семейство SHA все еще можно считать хорошим выбором, поскольку он, вероятно, будет поддерживаться во всех основных браузерах.

Создание пары ключей RSA и преобразование в формат PEM

В этом примере вы узнаете, как создать пару ключей RSA-OAEP и как преобразовать закрытый ключ из этой пары ключей в base64, чтобы вы могли использовать его с OpenSSL и т. Д. Обратите внимание, что этот процесс также можно использовать для открытого ключа, который у вас есть для использования префикса и суффикса ниже:

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

ПРИМЕЧАНИЕ. Этот пример полностью протестирован в этих браузерах: Chrome, Firefox, Opera, Vivaldi

function arrayBufferToBase64(arrayBuffer) {
    var byteArray = new Uint8Array(arrayBuffer);
    var byteString = '';
    for(var i=0; i < byteArray.byteLength; i++) {
        byteString += String.fromCharCode(byteArray[i]);
    }
    var b64 = window.btoa(byteString);

    return b64;
}

function addNewLines(str) {
    var finalString = '';
    while(str.length > 0) {
        finalString += str.substring(0, 64) + '\n';
        str = str.substring(64);
    }

    return finalString;
}

function toPem(privateKey) {
    var b64 = addNewLines(arrayBufferToBase64(privateKey));
    var pem = "-----BEGIN PRIVATE KEY-----\n" + b64 + "-----END PRIVATE KEY-----";
    
    return pem;
}

// Let's generate the key pair first
window.crypto.subtle.generateKey(
    {
        name: "RSA-OAEP",
        modulusLength: 2048, // can be 1024, 2048 or 4096
        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
        hash: {name: "SHA-256"} // or SHA-512
    },
    true,
    ["encrypt", "decrypt"]
).then(function(keyPair) {
    /* now when the key pair is generated we are going
       to export it from the keypair object in pkcs8
    */
    window.crypto.subtle.exportKey(
        "pkcs8",
        keyPair.privateKey
    ).then(function(exportedPrivateKey) {
        // converting exported private key to PEM format
        var pem = toPem(exportedPrivateKey);
        console.log(pem);
    }).catch(function(err) {
        console.log(err);
    });
});

Это оно! Теперь у вас есть полностью работающий и совместимый RSA-OAEP Private Key в формате PEM, который вы можете использовать в любом месте. Наслаждайтесь!

Преобразование пары ключей PEM в CryptoKey

Итак, вы когда-нибудь задумывались над тем, как использовать пару ключей PEM RSA, созданную OpenSSL в API веб-криптографии? Если ответы да. Большой! Вы узнаете.

ПРИМЕЧАНИЕ. Этот процесс также можно использовать для открытого ключа, вам нужно только изменить префикс и суффикс, чтобы:

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

В этом примере предполагается, что у вас есть пара ключей RSA, сгенерированная в PEM.

function removeLines(str) {
    return str.replace("\n", "");
}

function base64ToArrayBuffer(b64) {
    var byteString = window.atob(b64);
    var byteArray = new Uint8Array(byteString.length);
    for(var i=0; i < byteString.length; i++) {
        byteArray[i] = byteString.charCodeAt(i);
    }

    return byteArray;
}

function pemToArrayBuffer(pem) {
    var b64Lines = removeLines(pem);
    var b64Prefix = b64Lines.replace('-----BEGIN PRIVATE KEY-----', '');
    var b64Final = b64Prefix.replace('-----END PRIVATE KEY-----', '');

    return base64ToArrayBuffer(b64Final);
}

window.crypto.subtle.importKey(
    "pkcs8",
    pemToArrayBuffer(yourprivatekey),
    {
        name: "RSA-OAEP",
        hash: {name: "SHA-256"} // or SHA-512
    },
    true,
    ["decrypt"]
).then(function(importedPrivateKey) {
    console.log(importedPrivateKey);
}).catch(function(err) {
    console.log(err);
});

И теперь все готово! Вы можете использовать свой импортированный ключ в API WebCrypto.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow