¿Es posible firmar datos de forma segura en un navegador web?

4

Hay una API WebCrypto en los navegadores. Permite a los clientes firmar datos . Sin embargo, me parece que no impide que la página web acceda a la clave privada.

Una vez que se haya generado la clave, se puede marcar como no extraíble y se puede guardar en la API de IndexedDb.

¿Cómo generar la clave, que está claro para el cliente que la página web no pudo acceder a la clave privada durante la generación?

Por ejemplo, la página web puede generar una clave extraíble y luego importarla como no extraíble y enviar la clave privada al servidor, que sirve a la página web.

(¿Es posible garantizar esto sin complementos de propiedad?)

    
pregunta TN. 16.08.2016 - 13:47
fuente

2 respuestas

1

Establecer la opción de extracción en falso le permite extraer la clave pública pero NO la clave privada.

Si coloca el siguiente código en JS Fiddle obtendrá "[object ArrayBuffer]" para la clave pública y "HEY: La clave no es extraíble" para la clave privada.

Puede seguir firmando con la clave privada protegida usando la referencia key_priv más adelante pero nunca leer la clave privada real.

Este es exactamente el comportamiento que estás buscando.

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);
            });
    });
});

Recuerde que solo necesita enviar al servidor la clave pública que puede usar para confirmar la firma.

    
respondido por el dave.zap 30.10.2016 - 18:02
fuente
1

Esto depende del caso de uso.

@ dave.zap ha mostrado cómo generar el par de llaves. Por supuesto, su servidor podría cambiar la lógica de generación en cualquier momento, pero asumiendo que el par de claves rara vez se genera, un usuario especialmente preocupado podría auditar el JS en cualquier momento durante la generación de claves (o el uso de herramientas de desarrollador agrega manualmente la clave en IndexedDB).

Esto ahora significa que JS no tiene más acceso al par de llaves. Solo ese cliente puede firmar documentos, lo que significa que sabe que cualquier documento firmado con esa clave privada provino de esa máquina.

Sin embargo, no hay nada que impida que el servidor de JavaScript descargue un documento externo, lo firme y lo devuelva.

    
respondido por el Hector 26.09.2017 - 09:53
fuente

Lea otras preguntas en las etiquetas