Baseline Widely available
å®å ¨ãªã³ã³ããã¹ãç¨: ãã®æ©è½ã¯ä¸é¨ã¾ãã¯ãã¹ã¦ã®å¯¾å¿ãã¦ãããã©ã¦ã¶ã¼ã«ããã¦ãå®å ¨ãªã³ã³ããã¹ã (HTTPS) ã§ã®ã¿å©ç¨ã§ãã¾ãã
wrapKey()
㯠SubtleCrypto
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ã¡ã½ããã§ãéµããã©ããããã¾ãã ããã¯ãå¤é¨ã®ãã¼ã¿ãã«ãªå½¢å¼ã§éµãã¨ã¯ã¹ãã¼ãããã¨ã¯ã¹ãã¼ããããéµãæå·åãããã¨ãæå³ãã¦ãã¾ãã éµãã©ãããããã¨ã§ãä¿è·ããã¦ããªããã¼ã¿ã¹ãã¢å
ãä¿è·ããã¦ããªããããã¯ã¼ã¯ä¸ã§ã®éä¿¡ãªã©ãä¿¡é ¼ããã¦ããªãç°å¢ã§éµãä¿è·ãããã¨ãæ¯æ´ãã¾ãã
SubtleCrypto.exportKey()
ã«ã¦ãéµã®ã¨ã¯ã¹ãã¼ãå½¢å¼ãæå®ãã¾ãã éµãã¨ã¯ã¹ãã¼ãããã«ã¯ãCryptoKey.extractable
ã true
ã«è¨å®ããå¿
è¦ãããã¾ãã
ããããwrapKey()
ã¯ã¨ã¯ã¹ãã¼ãããéµãæå·åããã®ã§ãæå·åã«ä½¿ç¨ããéµã渡ãå¿
è¦ãããã¾ãã ããã¯ãã©ããã³ã°éµãã¨å¼ã°ãããã¨ãããã¾ãã
wrapKey()
ã®é㯠SubtleCrypto.unwrapKey()
ã§ããwrapKey
ãã¨ã¯ã¹ãã¼ãï¼æå·åã§æ§æãããã®ã«å¯¾ãã¦ãunwrapKey
ã¯ã¤ã³ãã¼ãï¼è¤åã§æ§æããã¾ãã
wrapKey(format, key, wrappingKey, wrapAlgo)
弿°
format
éµãæå·åãããåã«ã¨ã¯ã¹ãã¼ãããããã¼ã¿å½¢å¼ãè¨è¿°ããæååã以ä¸ã®ããããã«ãªãã¾ãã
raw
Raw å½¢å¼ã
pkcs8
PKCS #8 å½¢å¼ã
spki
SubjectPublicKeyInfo å½¢å¼ã
jwk
JSON ã¦ã§ãéµ å½¢å¼ã
key
ã©ãããã CryptoKey
ã
wrappingkey
ã¨ã¯ã¹ãã¼ãããããã¼ãæå·åãã CryptoKey
ããã㯠wrapKey
ã®ä½¿ç¨æ³ããªããã°ãªãã¾ããã
wrapAlgo
ã¨ã¯ã¹ãã¼ããããéµãæå·åããããã«ä½¿ç¨ããã¢ã«ã´ãªãºã ã¨ãå¿ è¦ãªè¿½å 弿°ãæå®ãããªãã¸ã§ã¯ãã§ãã
RsaOaepParams
ãªãã¸ã§ã¯ããæ¸¡ãã¦ãã ãããAesCtrParams
ãªãã¸ã§ã¯ããæ¸¡ãã¦ãã ãããAesCbcParams
ãªãã¸ã§ã¯ããæ¸¡ãã¦ãã ãããAesGcmParams
ãªãã¸ã§ã¯ããæ¸¡ãã¦ãã ããã"AES-KW"
ã¾ã㯠{ name: "AES-KW }
ã®å½¢ã®ãªãã¸ã§ã¯ããæ¸¡ãã¦ãã ãããæå·åãããã¨ã¯ã¹ãã¼ãéµãæ ¼ç´ãã ArrayBuffer
ã§å±¥è¡ããããããã¹ (Promise
) ã§ãã
以ä¸ã®ä¾å¤ãçºçããå ´åããããã¹ã¯æå¦ããã¾ãã
InvalidAccessError
DOMException
ã©ãããã¼ããªã¯ã¨ã¹ããããã©ããã¢ã«ã´ãªãºã ã®ãã¼ã§ãªãå ´åã«çºçãã¾ãã
NotSupported
DOMException
æªç¥ã®ã¢ã«ã´ãªãºã ãã¾ãã¯æå·åãã©ããã³ã°ã«é©ãã¦ããªãã¢ã«ã´ãªãºã ã使ç¨ãããã¨ããã¨ãã«çºçãã¾ãã
TypeError
ç¡å¹ãªæ¸å¼ã使ç¨ãããã¨ããã¨ãã«çºçãã¾ãã
æå·åã«ä½¿ç¨ã§ããã¢ã«ã´ãªãºã ã¯ãã¹ã¦ãéµã« "wrapKey" ã®ç¨éãè¨å®ãã¦ããéããéµã®ã©ããã³ã°ã«ã使ç¨ã§ãã¾ãã éµã®ã©ããã³ã°ã«ã¯ã AES-KW ã¨ãã追å ãªãã·ã§ã³ãããã¾ãã
AES-KWAES-KW 㯠AES æå·ãéµã®ã©ããã³ã°ã«ä½¿ç¨ããæ¹æ³ã§ãã
AES-GCM ã®ãããªä»ã® AES ã¢ã¼ãã¨æ¯è¼ã㦠AES-KW ã使ç¨ããå©ç¹ã® 1 ã¤ã¯ã AES-KW ãåæåãã¯ãã«ãå¿ è¦ã¨ããªããã¨ã§ãã AES-KW ã使ç¨ããã«ã¯ãå ¥å㯠64 ãããã®åæ°ã§ãªããã°ãªãã¾ããã
AES-KW 㯠RFC 3394 ã§å®ç¾©ããã¦ãã¾ãã
ä¾ã¡ã¢: GitHub ã§åä½ä¾ã試ããã¨ãã§ãã¾ãã
Raw ã©ãããã®ä¾ã¯ AES éµãã©ãããã¦ãã¾ãã ã¨ã¯ã¹ãã¼ãå½¢å¼ã¨ã㦠"raw" ã使ç¨ããæå·åã«ã¯ãã¹ã¯ã¼ãç±æ¥ã®éµã«ãã AES-KW ã使ç¨ãã¦ãã¾ããå®å ¨ãªã³ã¼ã㯠GitHub ã§åç §ãã¦ãã ããã
let salt;
/*
Get some key material to use as input to the deriveKey method.
The key material is a password supplied by the user.
*/
function getKeyMaterial() {
const password = window.prompt("Enter your password");
const enc = new TextEncoder();
return window.crypto.subtle.importKey(
"raw",
enc.encode(password),
{ name: "PBKDF2" },
false,
["deriveBits", "deriveKey"],
);
}
/*
Given some key material and some random salt
derive an AES-KW key using PBKDF2.
*/
function getKey(keyMaterial, salt) {
return window.crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt,
iterations: 100000,
hash: "SHA-256",
},
keyMaterial,
{ name: "AES-KW", length: 256 },
true,
["wrapKey", "unwrapKey"],
);
}
/*
Wrap the given key.
*/
async function wrapCryptoKey(keyToWrap) {
// get the key encryption key
const keyMaterial = await getKeyMaterial();
salt = window.crypto.getRandomValues(new Uint8Array(16));
const wrappingKey = await getKey(keyMaterial, salt);
return window.crypto.subtle.wrapKey("raw", keyToWrap, wrappingKey, "AES-KW");
}
/*
Generate an encrypt/decrypt secret key,
then wrap it.
*/
window.crypto.subtle
.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
)
.then((secretKey) => wrapCryptoKey(secretKey))
.then((wrappedKey) => console.log(wrappedKey));
PKCS #8 ã©ãã
ãã®ä¾ã¯ RSA ç§å¯ç½²åéµãã©ãããã¦ãã¾ããã¨ã¯ã¹ãã¼ãå½¢å¼ã¨ã㦠"pkcs8" ãç¨ããæå·åã«ã¯ãã¹ã¯ã¼ãããæ´¾çããéµãç¨ãã AES-GCM ã使ç¨ãã¦ãã¾ãã å®å ¨ãªã³ã¼ã㯠GitHub ã§åç §ãã¦ãã ããã
let salt;
let iv;
/*
Get some key material to use as input to the deriveKey method.
The key material is a password supplied by the user.
*/
function getKeyMaterial() {
const password = window.prompt("Enter your password");
const enc = new TextEncoder();
return window.crypto.subtle.importKey(
"raw",
enc.encode(password),
{ name: "PBKDF2" },
false,
["deriveBits", "deriveKey"],
);
}
/*
Given some key material and some random salt
derive an AES-GCM key using PBKDF2.
*/
function getKey(keyMaterial, salt) {
return window.crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt,
iterations: 100000,
hash: "SHA-256",
},
keyMaterial,
{ name: "AES-GCM", length: 256 },
true,
["wrapKey", "unwrapKey"],
);
}
/*
Wrap the given key.
*/
async function wrapCryptoKey(keyToWrap) {
// get the key encryption key
const keyMaterial = await getKeyMaterial();
salt = window.crypto.getRandomValues(new Uint8Array(16));
const wrappingKey = await getKey(keyMaterial, salt);
iv = window.crypto.getRandomValues(new Uint8Array(12));
return window.crypto.subtle.wrapKey("pkcs8", keyToWrap, wrappingKey, {
name: "AES-GCM",
iv,
});
}
/*
Generate a sign/verify key pair,
then wrap the private key.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-PSS",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["sign", "verify"],
)
.then((keyPair) => wrapCryptoKey(keyPair.privateKey))
.then((wrappedKey) => {
console.log(wrappedKey);
});
SubjectPublicKeyInfo ã©ãã
ãã®ä¾ã§ã¯ã RSA å ¬éæå·éµãã©ãããã¦ãã¾ããã¨ã¯ã¹ãã¼ãå½¢å¼ã¨ã㦠"spki" ãç¨ããæå·åã«ã¯ãã¹ã¯ã¼ãç±æ¥ã®éµã«ãã AES-CBC ã使ç¨ãã¦ãã¾ãã å®å ¨ãªã³ã¼ã㯠GitHub ã§åç §ãã¦ãã ããã
let salt;
let iv;
/*
Get some key material to use as input to the deriveKey method.
The key material is a password supplied by the user.
*/
function getKeyMaterial() {
const password = window.prompt("Enter your password");
const enc = new TextEncoder();
return window.crypto.subtle.importKey(
"raw",
enc.encode(password),
{ name: "PBKDF2" },
false,
["deriveBits", "deriveKey"],
);
}
/*
Given some key material and some random salt
derive an AES-CBC key using PBKDF2.
*/
function getKey(keyMaterial, salt) {
return window.crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt,
iterations: 100000,
hash: "SHA-256",
},
keyMaterial,
{ name: "AES-CBC", length: 256 },
true,
["wrapKey", "unwrapKey"],
);
}
/*
Wrap the given key.
*/
async function wrapCryptoKey(keyToWrap) {
// get the key encryption key
const keyMaterial = await getKeyMaterial();
salt = window.crypto.getRandomValues(new Uint8Array(16));
const wrappingKey = await getKey(keyMaterial, salt);
iv = window.crypto.getRandomValues(new Uint8Array(16));
return window.crypto.subtle.wrapKey("spki", keyToWrap, wrappingKey, {
name: "AES-CBC",
iv,
});
}
/*
Generate an encrypt/decrypt key pair,
then wrap it.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-OAEP",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"],
)
.then((keyPair) => wrapCryptoKey(keyPair.publicKey))
.then((wrappedKey) => console.log(wrappedKey));
JSON ã¦ã§ãéµã©ãã
ãã®ä¾ã¯ ECDSA ç§å¯éµãã©ãããã¦ãã¾ããã¨ã¯ã¹ãã¼ãå½¢å¼ã¨ã㦠"jwk" ãç¨ããæå·åã«ã¯ãã¹ã¯ã¼ãç±æ¥ã®éµã«ãã AES-GCM ã使ç¨ãã¦ãã¾ãã å®å ¨ãªã³ã¼ã㯠GitHub ã§åç §ãã¦ãã ããã
let salt;
let iv;
/*
Get some key material to use as input to the deriveKey method.
The key material is a password supplied by the user.
*/
function getKeyMaterial() {
const password = window.prompt("Enter your password");
const enc = new TextEncoder();
return window.crypto.subtle.importKey(
"raw",
enc.encode(password),
{ name: "PBKDF2" },
false,
["deriveBits", "deriveKey"],
);
}
/*
Given some key material and some random salt
derive an AES-GCM key using PBKDF2.
*/
function getKey(keyMaterial, salt) {
return window.crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt,
iterations: 100000,
hash: "SHA-256",
},
keyMaterial,
{ name: "AES-GCM", length: 256 },
true,
["wrapKey", "unwrapKey"],
);
}
/*
Wrap the given key.
*/
async function wrapCryptoKey(keyToWrap) {
// get the key encryption key
const keyMaterial = await getKeyMaterial();
salt = window.crypto.getRandomValues(new Uint8Array(16));
const wrappingKey = await getKey(keyMaterial, salt);
iv = window.crypto.getRandomValues(new Uint8Array(12));
return window.crypto.subtle.wrapKey("jwk", keyToWrap, wrappingKey, {
name: "AES-GCM",
iv,
});
}
/*
Generate a sign/verify key pair,
then wrap the private key
*/
window.crypto.subtle
.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
)
.then((keyPair) => wrapCryptoKey(keyPair.privateKey))
.then((wrappedKey) => console.log(wrappedKey));
仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§ é¢é£æ
å ±
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4