2017-06-23 7 views
0

J'utilise Webcrypto API pour certains travaux cryptographiques sur le client. Bien que je ne puisse pas envelopper et déplier les clés, le navigateur a toujours renvoyé l'erreur suivante.Enveloppez et déverrouillez les clés avec l'API WebCrypto

DOMException [OperationError: "The operation failed for an operation-specific reason" 

Vous et moi ne pouvons pas faire grand chose avec cette erreur, j'ai donc collé mon code.

function wrapPrivateKey(privateKey, wrappingKey) { 
    var iv = window.crypto.getRandomValues(new Uint8Array(12)); 
    return window.crypto.subtle.wrapKey(
     "jwk", 
     privateKey, 
     wrappingKey, 
     { 
      name: "AES-GCM", 
      length: 256, 
      iv: iv, 
     } 
     ) 
     .then(function (key) { 
      return { 
       "key": StringToB64(arrayBufferToString(key)), 
       "iv": StringToB64(arrayBufferToString(iv)) 
      }; 
     }) 
     .catch(function (err) { 
      console.error(err); 
      return false; 
     }); 
} 

function unwrapPrivateKey(wrappedPrivateKey, unwrappingKey) { 
    var obj = JSON.parse(B64ToString(wrappedPrivateKey)); 
    var key = stringToArrayBuffer(B64ToString(obj["key"])); 
    var iv = stringToArrayBuffer(B64ToString(obj["iv"])); 
    return window.crypto.subtle.unwrapKey(
     "jwk", 
     key, 
     unwrappingKey, 
     { 
      name: "AES-GCM", 
      length: 256, 
      iv: iv, 
     }, 
     { 
      name: "RSA-OAEP", 
      hash: {name: "SHA-256"}, 
     }, 
     true, 
     ["encrypt", "decrypt"] 
     ) 
     .then(function (key) { 
      return key; 
     }) 
     .catch(function (err) { 
      console.error(err); 
      return false; 
     }); 
} 

Je ne sais pas si le problème est lié à la conversion des objets clés en chaînes. Malheureusement, j'ai besoin de le convertir en une chaîne pour le conserver dans une base de données.

+0

Avec l'API WebCrypto, il est fondamental que vous affichiez également la version du navigateur car le support est minime. Je vois que vous essayez d'effectuer toutes les opérations sur une seule ligne: diviser cette ligne et au moins trouver quelle méthode est le coupable. C'est un débogage de base. –

Répondre

1

Voici un exemple simple d'emballage/déballage de clé. Ce code fonctionne dans Chrome/Mozilla

const rsaAlg = { 
    name: "RSA-OAEP", 
    hash: "SHA-256", 
    publicExponent: new Uint8Array([1, 0, 1]), 
    modulusLength: 2048 
}; 
const aesAlg = { 
    name: "AES-GCM", 
    length: 256, 
    iv: crypto.getRandomValues(new Uint8Array(12)), 
}; 

crypto.subtle.generateKey(rsaAlg, true, ["encrypt", "decrypt"]) 
    .then((rsaKeys) => { 
     return crypto.subtle.generateKey(aesAlg, true, ["encrypt", "decrypt", "wrapKey", "unwrapKey"]) 
      .then((aesKey) => { 
       return crypto.subtle.wrapKey("jwk", rsaKeys.privateKey, aesKey, aesAlg) 
        .then((wrappedKey) => { 
         console.log(wrappedKey); // ArrayBuffer 

         // Unwrap key 
         return crypto.subtle.unwrapKey("jwk", wrappedKey, aesKey, aesAlg, rsaAlg, true, ["decrypt"]) 
        }) 
        .then((unwrappedKey) => { 
         console.log(unwrappedKey); 
        }) 
      }) 
    }) 
    .catch((err) => { 
     console.error(err); 
    }) 

L'API WebCrypto est différente d'un navigateur à l'autre. Il serait préférable d'utiliser certains modules qui permet de le résoudre webcrypto-shim, webcrypto-liner

Aussi, je vois que vous utilisez var key = stringToArrayBuffer(B64ToString(obj["key"]));. Mais la clé doit être CryptoKey. Si vous avez brut de clé symétrique vous devez utiliser la fonction importKey pour créer CryptoKey de raw