web-dev-qa-db-fra.com

Math.random () est-il cryptographiquement sécurisé?

Quelle est la qualité des algorithmes utilisés en Javascript Math.random() dans différents navigateurs? Est-il acceptable de l'utiliser pour générer des sels et des mots de passe à usage unique?

Combien de bits d'un random puis-je utiliser?

46
grep

Nan; La fonction Math.random() de JavaScript n'est pas un générateur de nombres aléatoires sécurisé par cryptographie. Il vaut mieux utiliser l'implémentation Fortuna de JavaScript Crypto Library qui est un puissant générateur de nombres pseudo-aléatoires (jetez un œil à src/js/Clipperz/Crypto/PRNG.js) ou API Web Crypto pour getRandomValues

38
Teoman Soygul

Ce n'est pas du tout sécurisé, et dans certains cas, c'était tellement prévisible que vous pouviez reconstruire l'état interne du PRNG, déduire la graine et donc l'utiliser pour suivre les gens sur les sites Web même s'ils n'utilisaient pas de cookies, cachés derrière le routage des oignons, etc. ...

16
Bruno Rohée

Depuis mars 2013, window.crypto.getRandomValues est une "technologie expérimentale" disponible depuis Chrome 11 et Firefox 21 qui vous permet d'obtenir des valeurs aléatoires cryptographiquement. Voir aussi getRandomValues du dernier W3C Web Cryptography API draft.

Description:

Si vous fournissez un entier TypedArray (c'est-à-dire Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, ou Uint32Array), la fonction va remplir le tableau avec des nombres aléatoires cryptographiquement. Le navigateur est censé utiliser un puissant générateur de nombres aléatoires (pseudo). La méthode lève QuotaExceededError si la longueur demandée est supérieure à 65 536 octets.

Exemple:

var array = new Uint32Array(10);
window.crypto.getRandomValues(array);

console.log("Your lucky numbers:");
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

En outre, une réponse à Quel est le degré aléatoire de Math.random de JavaScript? fait référence à Suivi temporaire des utilisateurs dans les principaux navigateurs et fuite et attaques d'informations interdomaines de 2008 qui explique comment le JavaScript La fonction Math.random () fuit des informations.

Mise à jour: Pour l'état actuel de la prise en charge du navigateur, consultez la section Modern.IE Web Crypto API , qui renvoie également à la - Chrome , Firefox et Safari rapports de bogues.

8
Kevin Hakanson

Parce que vous ne pouvez pas connaître l'implémentation exacte du navigateur (sauf pour les groupes d'utilisateurs fermés comme pour votre intranet d'entreprise), je considérerais généralement le RNG comme faible.

Même si vous pouvez identifier le navigateur, vous ne savez pas si le navigateur lui-même ou tout autre ID d'agent de navigateur est manipulé. Si vous le pouvez, vous devez générer le numéro sur le serveur.

Même si vous incluez un bon PRNG dans votre JavaScript, votre serveur ne peut pas savoir si la demande du client provient d'un script non modifié. Si le numéro va dans votre base de données et/ou est utilisé comme cryptographique outil ce n'est pas une bonne idée de faire confiance aux données du client du tout. Cela est vrai non seulement pour la validité (vous validez toutes les données provenant du client, n'est-ce pas?) mais aussi pour propriétés générales comme le caractère aléatoire.

3
Daniel Böhmer

Math.random() n'est pas sécurisée cryptographiquement. Veracode pointera également cet événement avec

CWE-331 (Entropie insuffisante)

Nous pourrions utiliser SecureRandom pour implémenter des fonctionnalités similaires.

new SecureRandom().nextDouble();
1
DecKno