È possibile firmare in modo sicuro i dati in un browser web?

4

Esiste un'API WebCrypto nei browser. Consente ai clienti di firmare i dati . Tuttavia, mi sembra che non impedisca alla pagina web di accedere alla chiave privata.

Dopo che la chiave è stata generata, può essere contrassegnata come non estraibile e può essere salvata nell'API IndexedDb.

Come generare la chiave, che è chiaro per il cliente che la pagina web non ha potuto accedere alla chiave privata durante la generazione?

Ad esempio, la pagina Web può generare una chiave estraibile e quindi importarla come non estraibile e inviare la chiave privata al server, che ha servito la pagina Web.

(È possibile garantire questo senza add-on proprietari?)

    
posta TN. 16.08.2016 - 13:47
fonte

2 risposte

1

L'impostazione dell'opzione di estrazione su false ti consente di estrarre la chiave pubblica ma NON la chiave privata.

Se inserisci il codice seguente in JS Fiddle otterrai "[oggetto ArrayBuffer]" per la chiave pubblica e "HEY: Key non estraibile" per la chiave privata.

È ancora possibile firmare con la chiave privata protetta utilizzando il riferimento key_priv in seguito, ma non leggere mai la chiave privata effettiva.

Questo è esattamente il comportamento che stai cercando.

window.crypto.subtle.generateKey(
{
    name: "RSASSA-PKCS1-v1_5",
    modulusLength: 1024,
    publicExponent: new Uint8Array([1, 0, 1]),  // 24 bit representation of 65537
    hash: {name: "SHA-256"}
},
false,   // can extract it later if we want
["sign", "verify"]).
then(function(key) {
    window.crypto.subtle.exportKey("spki", key.publicKey).
        then(function(key_pub) {
    alert(key_pub);
        window.crypto.subtle.exportKey("pkcs8", key.privateKey).
        then(function(key_priv) {
                alert(key_priv);
            }).catch(function(err) {
                alert("HEY!: " + err.message);
            });
    });
});

Ricorda che devi solo inviare al server la chiave pubblica che può utilizzare per confermare la firma.

    
risposta data 30.10.2016 - 18:02
fonte
1

Dipende dal caso d'uso.

@ dave.zap ha mostrato come generare la coppia di chiavi. Naturalmente il tuo server potrebbe cambiare la logica di generazione in qualsiasi momento, ma supponendo che la coppia di chiavi venga generata raramente un utente particolarmente interessato potrebbe controllare il JS in qualsiasi momento durante la generazione della chiave (o utilizzando gli strumenti di sviluppo manualmente aggiungere la chiave in IndexedDB).

Questo significa ora che il JS non ha più accesso alla coppia di chiavi. Solo quel cliente può firmare i documenti, il che significa che sai che qualsiasi documento firmato con quella chiave privata proviene da quella macchina.

Tuttavia non c'è nulla per fermare il server che fornisce JavaScript che scarica un documento estraneo, lo firma e lo rimanda.

    
risposta data 26.09.2017 - 09:53
fonte