如何保密 RSA - 浏览器中的私钥 - 使用非对称密钥实现所有权证明
How keep in the secret the RSA - private key in browser - implement Proof of Possession with an Asymmetric Key
我想用非对称密钥 specs 实现 Proof of Possession
。
我想将 RSA 存储在浏览器中的安全位置 - 我将能够使用私钥对请求的部分进行签名,并使用 public 密钥作为 JWT 验证请求的一部分。
我不知道如何将 RSA 导入我的浏览器 - 我可以在浏览器的什么地方安全地存储 RSA 私钥?
或许您可以创建一个用于保存密钥的扩展程序。考虑到如果您需要在浏览器中存储私钥,默认情况下您应该只允许存储加密密钥,此外,如果您 want/need 存储更多密钥,则不允许在不同的密钥文件上使用相同的密码。
还可以考虑使用主密钥 and/or OTP 来解密商店。
寻找可以使用这些东西的扩展可以节省一些工作
查看 WebCrypto API 和 IndexedDB。这里有一些 WebCrypto 示例 - https://github.com/diafygi/webcrypto-examples.
这将允许您以无法提取密钥的方式导入密钥 - 仅用于签名和验证签名。但是,当勾选 "clear application data"(/类似 - 取决于浏览器)标志清除浏览器数据时,这将被擦除。
例如导入一个键并将其存储在 IndexedDB 中(此代码尚未经过测试/_openDb 必须实现)-
window.crypto.subtle.importKey(
"jwk", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only)
{ //this is an example jwk key, other key types are Uint8Array objects
kty: "RSA",
e: "AQAB",
n: "vGO3eU16ag9zRkJ4AK8ZUZrjbtp5xWK0LyFMNT8933evJoHeczexMUzSiXaLrEFSyQZortk81zJH3y41MBO_UFDO_X0crAquNrkjZDrf9Scc5-MdxlWU2Jl7Gc4Z18AC9aNibWVmXhgvHYkEoFdLCFG-2Sq-qIyW4KFkjan05IE",
alg: "PS256",
ext: true,
},
{ //these are the algorithm options
name: "RSA-PSS",
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
false, //whether the key is extractable (i.e. can be used in exportKey)
["verify"] //"verify" for public key import, "sign" for private key imports
).then(function(key){
((_db_handle === null) ?
_openDb() :
Promise.resolve()
).then(function() {
let tx = _db_handle.transaction("KeyStore", "readwrite");
let store = tx.objectStore("KeyStore");
let putKey = store.put({id: "Key 1", key: key});
putKey.onsuccess = function() {
resolve();
};
putKey.onerror = function() {
reject(putKey.error);
};
});
})
然后再读出来-
let tx = _db_handle.transaction("KeyStore", "readwrite");
let store = tx.objectStore("KeyStore");
let getKey = store.get("Key 1");
getKey.onsuccess = function() {
resolve(getKey.result ? getKey.result.key : null);
};
getKey.onerror = function() {
reject(getKey.error);
};
我想用非对称密钥 specs 实现 Proof of Possession
。
我想将 RSA 存储在浏览器中的安全位置 - 我将能够使用私钥对请求的部分进行签名,并使用 public 密钥作为 JWT 验证请求的一部分。
我不知道如何将 RSA 导入我的浏览器 - 我可以在浏览器的什么地方安全地存储 RSA 私钥?
或许您可以创建一个用于保存密钥的扩展程序。考虑到如果您需要在浏览器中存储私钥,默认情况下您应该只允许存储加密密钥,此外,如果您 want/need 存储更多密钥,则不允许在不同的密钥文件上使用相同的密码。
还可以考虑使用主密钥 and/or OTP 来解密商店。
寻找可以使用这些东西的扩展可以节省一些工作
查看 WebCrypto API 和 IndexedDB。这里有一些 WebCrypto 示例 - https://github.com/diafygi/webcrypto-examples.
这将允许您以无法提取密钥的方式导入密钥 - 仅用于签名和验证签名。但是,当勾选 "clear application data"(/类似 - 取决于浏览器)标志清除浏览器数据时,这将被擦除。
例如导入一个键并将其存储在 IndexedDB 中(此代码尚未经过测试/_openDb 必须实现)-
window.crypto.subtle.importKey(
"jwk", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only)
{ //this is an example jwk key, other key types are Uint8Array objects
kty: "RSA",
e: "AQAB",
n: "vGO3eU16ag9zRkJ4AK8ZUZrjbtp5xWK0LyFMNT8933evJoHeczexMUzSiXaLrEFSyQZortk81zJH3y41MBO_UFDO_X0crAquNrkjZDrf9Scc5-MdxlWU2Jl7Gc4Z18AC9aNibWVmXhgvHYkEoFdLCFG-2Sq-qIyW4KFkjan05IE",
alg: "PS256",
ext: true,
},
{ //these are the algorithm options
name: "RSA-PSS",
hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
},
false, //whether the key is extractable (i.e. can be used in exportKey)
["verify"] //"verify" for public key import, "sign" for private key imports
).then(function(key){
((_db_handle === null) ?
_openDb() :
Promise.resolve()
).then(function() {
let tx = _db_handle.transaction("KeyStore", "readwrite");
let store = tx.objectStore("KeyStore");
let putKey = store.put({id: "Key 1", key: key});
putKey.onsuccess = function() {
resolve();
};
putKey.onerror = function() {
reject(putKey.error);
};
});
})
然后再读出来-
let tx = _db_handle.transaction("KeyStore", "readwrite");
let store = tx.objectStore("KeyStore");
let getKey = store.get("Key 1");
getKey.onsuccess = function() {
resolve(getKey.result ? getKey.result.key : null);
};
getKey.onerror = function() {
reject(getKey.error);
};