web-dev-qa-db-fra.com

Quelle devrait être la taille du sel?

J'utiliserai scrypt pour stocker les mots de passe dans mon application. En tant que tel, j'utiliserai les primitives cryptographiques SHA-256 et Salsa20 (avec PBKDF2).

Cela dit, quelle quantité de sel dois-je utiliser? Doit-il être égal à la taille de la sortie SHA-256: 256 bits ou doit-il être égal au nombre de bits que je prendrai de cette fonction d'étirement de mot de passe: 512 bits?

Étant donné que SSHA tel qu'utilisé par OpenLDAP n'a que du sel 32 bits et que crypt () Linux utilise du sel 48 bits, mes sels semblent assez gros ...

En général: quelle est la règle générale pour la taille du sel?


En relation:

Que faut-il utiliser comme sel?

Qu'est-ce qu'un assez bon sel pour un SaltedHash?

30
Hubert Kario

Les sels doivent être uniques; c'est leur seul et unique travail. Vous devez vous efforcer, autant que possible, de ne jamais réutiliser une valeur de sel; la réutilisation occasionnelle est rarement critique mais doit toujours être évitée). Avec des schémas de mots de passe raisonnablement conçus, il n'y a pas d'autre propriété utile dans les sels que l'unicité; vous pouvez les choisir comme vous le souhaitez tant que vous ne reproduisez pas exactement la même séquence de bits. L'unicité doit être comprise dans le monde entier.

(Avec des schémas de hachage de mot de passe mal conçus, le sel peut avoir certaines propriétés supplémentaires requises, mais si vous utilisez un schéma de mot de passe mal conçu, vous avez déjà de plus gros problèmes. Notez qu'un sel n'est pas exactement la même chose qu'un vecteur d'initialisation pour le chiffrement symétrique, où des exigences strictes comme le caractère aléatoire uniforme imprévisible s'appliquent généralement.)

Un moyen commun avoir des valeurs de sel plus ou moins uniques, c'est les générer aléatoirement, avec un bon générateur (disons, qui est adapté à des usages cryptographiques, comme /dev/urandom). Si le sel est suffisamment long, les risques de collisions (c'est-à-dire la réutilisation d'une valeur de sel) sont faibles. Si vous utilisez n - sels de bits, les risques de collision deviennent non négligeables lorsque vous atteignez environ 2n/2 valeurs générées. Il y a environ 7 milliards de personnes sur cette planète, et il semble sûr de supposer qu'elles possèdent en moyenne moins de 1 000 mots de passe chacune, donc le nombre mondial de mots de passe hachés doit être légèrement inférieur à 242,7. Par conséquent, 86 morceaux de sel devraient suffire. Puisque nous aimons un peu les soi-disant "marges de sécurité", et, en outre, comme les programmeurs ne font que love des puissances de deux, passons à 128 bits . Selon l'analyse ci-dessus, c'est plus que suffisant pour assurer l'unicité mondiale avec une probabilité suffisamment élevée, et nous ne voulons rien de plus d'un sel que l'unicité.

L'unicité peut également être assurée par d'autres moyens, par ex. en utilisant comme sel la concaténation du nom du serveur (le système DNS mondial garantit déjà que tout le monde peut obtenir son propre nom de serveur, distinct de celui de n'importe qui d'autre sur la planète) et un compteur à l'échelle du serveur. Cela soulève des problèmes pratiques, par exemple maintien d'une valeur de compteur qui ne se répète pas, même dans le cas d'un plantage et d'un redémarrage intempestifs du serveur, et/ou de plusieurs frontaux avec équilibrage de charge. Un sel aléatoire de longueur fixe est plus facile.

33
Thomas Pornin

"Il doit faire au moins huit octets (64 bits)." de: http://www.ietf.org/rfc/rfc2898.txt

7
woliveirajr