Comment générer un mot de passe aléatoire?
J'ai besoin de générer un mot de passe aléatoire qui sera utilisé dans OpenPGP.js pour crypter quelque chose de manière symétrique. L'utilisateur ne devrait jamais avoir à toucher ou voir le mot de passe (tout se passe dans les coulisses). Ainsi, idéalement, le mot de passe ne serait qu'un nombre d'octets aléatoires. Malheureusement, OpenPGP.js ne prend pas en charge cela (à ma connaissance). Il ne prend en charge que les chaînes comme mots de passe.
J'ai donc besoin de générer une chaîne de mot de passe aléatoire. Je veux que ce soit aussi aléatoire que possible; en excluant le moins de caractères possible.
Comment puis-je générer une chaîne de mot de passe aléatoire sécurisée?
J'ai actuellement ceci:
String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));
Cependant, je crains un peu que cela puisse gâcher les paires de substitution UTF-16 lorsque certains octets aléatoires apparaissent, et que le mot de passe puisse être interprété différemment sur d'autres navigateurs en fonction de leur implémentation Unicode.
Cette solution est-elle sûre à utiliser sur tous les navigateurs?
Pour répondre à ma propre question:
Une partie de mon système crypte et déchiffre les mots de passe (comme celui aléatoire dans la question). Lors du test de ma solution avec OpenPGP.js, la chaîne renvoyée par l'opération de décryptage (après le cryptage) de manière aléatoire ne correspond pas complètement à la chaîne d'origine (peut-être une sur dix).
Cela suggère qu'OpenPGP.js ne sérialise pas ou ne désérialise pas correctement UTF-8 (ou quel que soit le codage qu'il utilise) lorsque son entrée est incorrecte. J'imagine que les chaînes que je produis ne sont pas Unicode invalides - du moins dans Chrome.
Je travaille quand je définis un jeu de caractères connu limité, évidemment.
Pour résumer:
String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));
n'est pas sûr à utiliser.