2012-05-18 5 views
4

J'écris quelque chose que needs to do electronic signatures.Génération de la paire de clés PGP et signature du texte avec une clé privée PGP cryptée, en Javascript

Certains utilisateurs seront geeks comme moi et auront déjà leurs propres clés PGP. La plupart ne le feront pas et ne voudront pas le faire avec l'installation ou la maintenance de toute façon.

En tant que solution de contournement, je veux faire ce qui suit:

  1. Créer une paire de clés public/privé pour l'utilisateur qui utilise un mot de passe « signature » séparée.
  2. Lorsque j'ai besoin que l'utilisateur signe quelque chose, fournissez le texte en clair à l'utilisateur, avec d'autres informations à l'intérieur comme des horodatages et autres références, et faites-le signer avec la clé privée que je stocke.

Il existe essentiellement deux façons de le faire (pour les utilisateurs qui n'ont pas leurs propres clés PGP).

  1. L'utilisateur me soumet le mot de passe de signature via SSL. Je génère le côté serveur de la clé privée et déverrouille temporairement la clé privée lorsque nécessaire pour signer. Je ne stocke pas le mot de passe du tout, et je me débarrasse de la clé privée déverrouillée dès que possible.
  2. L'utilisateur génère la clé pub/priv en Javascript. Ils m'envoient le pubkey et la clé privée cryptée et gardent une copie dans le stockage local. Quand ils ont besoin de signer quelque chose, je m'assure que leur stockage local l'a (et le pousse sinon), ils décryptent et signent le texte localement en utilisant JS. Je ne vois jamais leur mot de passe de signature ni leur clé privée déverrouillée.

De toute façon, je signe également le résultat w/la clé du serveur. Mais j'ai besoin qu'il y ait un moyen unique, non répudiable, pour l'utilisateur de signer du texte, et avoir une clé PGP que je maintiens est la manière la plus simple de le faire.

L'option 1 est beaucoup plus simple à faire et fonctionne assez bien pour répondre à mes besoins minimums.

L'option 2 est un peu plus fiable, à moins que je subvertir le JS (que je pourrais encore faire), je ne peux pas utiliser leur privkey moi-même.

Toutefois, afin de le faire, je besoin d'une bibliothèque JavaScript qui peut

  1. générer un pub/PRIV keypair
  2. décrypter une clé privée pour signe utilisation
  3. un bloc de texte avec cette clé privée

Quelles bibliothèques peuvent faire cela?

P.S. Veuillez noter que je n'ai pas besoin de pour chiffrer à une clé publique donnée. J'ai besoin de l'utilisateur signe avec leur propre clé (cryptée-comme-stocké).

Répondre

3

D'abord, lisez cet article: http://www.matasano.com/articles/javascript-cryptography/

Si vous êtes toujours convaincu que le javascript est Crypto une bonne idée pour ce que vous faites, alors:

PGP est assez compliqué et vous n'avez pas besoin 95% de ce qu'il fait, je vous recommande plutôt d'utiliser Ed25519 pour les signatures - une version javascript est disponible au http://www.flownet.com/ron/code/ed25519.js. C'est un système basé sur une courbe elliptique qui est sensiblement plus rapide que RSA avec une sécurité équivalente et des clés beaucoup plus petites. Les touches sont si petits, en fait, que vous pouvez avoir l'utilisateur de choisir une « passphrase signature », le nourrir à Scrypt [1] avec leur ID utilisateur sous forme de sel, et d'utiliser la sortie comme la clé privée (vous avez juste besoin frob trois bits pour en faire une clé privée Ed25519 valide).

  1. https://github.com/cheongwy/node-scrypt-js
4

Jetez un oeil à http://openpgpjs.org - il aurait mis en œuvre la plupart des fonctionnalités que vous recherchez.

1

Je pense que votre article prétend de mauvaises choses. Par exemple, il est dit, il n'y aurait aucun moyen d'empêcher par exemple math.RND() d'être écrasé - mais cela peut être fait facilement - écrire le fichier html avec js en ligne sur le dessus du fichier. dans ce code vous gelez chaque objet, openpgp.js dépend.

Object.freeze()

vous pouvez donc construire un env sûr. effectivement! transfert index.html avec ssl, gel ce qui est important, empêcher d'autres fichiers js à charger, assurer que les connexions vers d'autres serveurs ne sont pas autorisés et ainsi de suite.

Questions connexes