web-dev-qa-db-fra.com

PBKDF2WithHmacSHA512 Vs. PBKDF2WithHmacSHA1

Je travaille sur un sous-système d'authentification Java qui spécifie le stockage des mots de passe dans la base de données comme PBKDF2- généré des hachages, et j'essaie maintenant de décider si je dois utiliser SHA1 ou SHA512 comme PRF. J'ai parcouru les spécifications des deux, mais elles sont très intensives en mathématiques pour moi. Quelqu'un avec une meilleure compréhension de la cryptographie peut-il expliquer comment PBKDF2WithHmacSHA512 diffère de PBKDF2WithHmacSHA1?

Voici ce que j'essaie de faire:

private static final int HASH_BYTE_SIZE = 64 * 8; // 512 bits
private static final int PBKDF2_ITERATIONS = 1000;      

// generate random salt
SecureRandom random = new SecureRandom();
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash
random.nextBytes(salt);

// generate Hash
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it?
byte[] hash = skf.generateSecret(spec).getEncoded();

// convert hash and salt to hex and store in DB as CHAR(64)...
24
DTs

Décomposons le mot morceau par morceau:

PBKDF2--WithHmac--SHA512

Passons en revue partie par partie

  • PBKDF2

    Signifie Password-based-Key-Derivative-Function, un successeur de PBKDF1 et est utilisé pour implémenter une fonction pseudo-aléatoire, comme un hachage cryptographique, un chiffre ou un HMAC pour le mot de passe ou la phrase secrète d'entrée avec une valeur de sel et répète le processus plusieurs fois pour produire une clé dérivée, qui peut ensuite être utilisée comme clé cryptographique dans les opérations suivantes.

  • [~ # ~] hmac [~ # ~]

    Abréviation de Keyed-Hash Message Authentication Code (HMAC) est une construction spécifique pour calculer un code d'authentification de message (MAC) impliquant une fonction de hachage cryptographique en combinaison avec une clé cryptographique secrète. Toute fonction de hachage cryptographique peut être utilisée dans le calcul d'un HMAC; l'algorithme MAC résultant est appelé HMAC-MD5 ou HMAC-SHA1 en conséquence.

  • SHA512

    Eh bien, vous le savez ..: P

Maintenant, revenons à votre question, la ligne de code:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

spécifie la keyFactory pour utiliser l'algorithme PDBKDF2WithHmacSHA1. Quand vous feriez quelque chose comme:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

vous dites à l'usine d'utiliser l'algorithme PBDKF2WithHmacSHA512.

Essentiellement, la principale différence entre PBKDF2WithHmacSHA1 Et PBKDF2WithHmacSHA512 Est que:

  1. Le PBKDF2WithHmacSHA1 Produira une longueur de hachage de 160 bits .
  2. Le PBKDF2WithHmacSHA512 Produira une longueur de hachage de 512 bits .

Par conséquent, ce dernier est plus sûr. Mais il y a des arguments des deux côtés quant à ce qui est suffisant pour le chiffrement. Pas de débat. Je dis juste.

Quelques informations supplémentaires sur les deux algorithmes:

  1. HMACSHA1

    HMACSHA1 est un type d'algorithme de hachage à clé construit à partir de la fonction de hachage SHA1 et utilisé comme HMAC ou code d'authentification de message basé sur le hachage. Le processus HMAC mélange une clé secrète avec les données de message, hache le résultat avec la fonction de hachage, mélange à nouveau cette valeur de hachage avec la clé secrète, puis applique la fonction de hachage une deuxième fois. Le hachage de sortie est de 160 bits.

  2. HMACSHA512

    HMACSHA512 est un type d'algorithme de hachage à clé construit à partir de la fonction de hachage SHA-512 et utilisé comme code d'authentification de message basé sur le hachage (HMAC). Le processus HMAC mélange une clé secrète avec les données du message et hache le résultat. La valeur de hachage est à nouveau mélangée avec la clé secrète, puis hachée une deuxième fois. Le hachage de sortie a une longueur de 512 bits.

Le principal avantage est que HmacWith512 Est plus sûr que HmacWith256. Par exemple.

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a

La différence est assez énorme (comme on le voit). J'espère que ça aide. :)

EDIT: Comme le mentionne OP

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

Le paramètre keyLength est utilisé pour indiquer la préférence sur la longueur de clé pour les chiffrements à taille de clé variable. La taille réelle de la clé dépend de l'implémentation de chaque fournisseur. Par conséquent, dites quelque chose comme

PBEKeySpec(password, salt, int 100, 512) ne signifie pas que vous utiliserez SHA1 pour générer une longueur de clé de 512. Cela signifie simplement que. SHA1 prend en charge jusqu'à un maximum de 160 bits. Vous ne pouvez pas dépasser cela.

Quant à votre deuxième question, jetez un œil au HMAC-SHA1 . Il existe de nombreuses déclarations qui disent que les algorithmes comme SHA256 Sont assez bons si vous avez un long hachage.

En outre, selon le NSA:

Le NSA spécifie que "la cryptographie à clé publique à courbe elliptique utilisant la courbe elliptique à module premier de 256 bits comme spécifié dans FIPS-186-2 et SHA-256 est appropriée pour protéger les informations classifiées jusqu'au SECRET L'utilisation de la courbe elliptique à module premier de 384 bits et du SHA-384 sont nécessaires pour la protection des informations TOP SECRET.

Je pense que l'utilisation d'une fonction HMAC avec SHA512 est assez sûre.

53
user2339071

SHA512 appartient à la famille SHA2 de fonctions de hachage cryptographique. Étant donné que SHA1 a des faiblesses théoriques et SHA512 est légèrement plus lent que SHA1 (plus lent est meilleur lors du hachage des mots de passe), SHA512 (ou n'importe quelle famille SHA2) doit être choisi plutôt que SHA1 pour le hachage des mots de passe.

En fait, comprendre les différences dans les fonctions ne sera pas simple, mais vous pourriez avoir une meilleure chance d'obtenir une réponse sur le site Crypto SE .

1
Spencer Uresk