如何保密RSA - 浏览器中的私钥 - 用非对称密钥实现占有证明

时间:2017-11-07 12:03:16

标签: browser rsa jwt

我想用非对称密钥specs实现Proof of Possession

我想将RSA存储在浏览器的安全位置 - 我将能够使用私钥和公钥作为JWT的一部分对请求的部分进行签名验证请求。

我不知道如何将RSA导入我的浏览器 - 在哪里可以将RSA私钥安全存储在浏览器中?

2 个答案:

答案 0 :(得分:1)

查看WebCrypto API和IndexedDB。这里有一些WebCrypto示例 - https://github.com/diafygi/webcrypto-examples

这将允许您以无法提取的方式导入密钥 - 仅用于签名和验证签名。但是,当清除浏览器数据并清除“清除应用程序数据”(/类似 - 取决于浏览器)标记时,这将被删除。

例如,导入密钥并将其存储在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);
};

答案 1 :(得分:0)

也许你可以为持有钥匙创建一个扩展。考虑一下,如果您需要在浏览器中存储私钥,您应该只允许按默认存储加密密钥,此外,如果您希望/需要存储更多密钥,则不允许在不同密钥文件上使用相同的密码。

还要考虑使用主密钥和/或OTP来解密商店。

寻找可以使用这些内容的扩展程序可以节省一些工作