サーチ…
備考
WebCrypto APIは、通常、「安全な」発信元でのみ使用できます。つまり、ドキュメントがHTTPSまたはローカルマシン( localhost
、 file:
:、ブラウザ拡張子)から読み込まれている必要がありfile:
。
これらのAPIは、W3Cウェブ暗号API候補者の推奨事項で指定されています 。
暗号的にランダムなデータ
// 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)
は、以下のクラスのインスタンス( バイナリデータで詳しく説明していますcrypto.getRandomValues(array)
で使用でき、指定された範囲(両端を含む)から値を生成します。
-
Int8Array
:-2 7 2 7 -1〜 -
Uint8Array
:0〜2 8 -1 -
Int16Array
:-2 15 2 15 -1〜 -
Uint16Array
:0〜2 16 -1 -
Int32Array
:-2 31 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秘密鍵がPEM形式で完全に動作し、互換性があります。楽しい!
PEMキーペアをCryptoKeyに変換する
ですから、あなたはWeb暗号化APIでOpenSSLによって生成されたPEM RSA鍵ペアをどのように使用するのか疑問に思いましたか?答えがYesの場合。すばらしいです!あなたは調べるつもりです。
注:このプロセスは公開鍵にも使用できます。接頭辞と接尾辞を変更するだけで済みます:
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
この例では、PEMでRSA鍵ペアが生成されていることを前提としています。
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);
});
そして今あなたは終わった! WebCrypto APIでインポートしたキーを使用できます。