PBKDF2 avec bouncycastle en Java

Je suis en train de stocker en toute sécurité d'un mot de passe dans une base de données et pour cela j'ai choisi de stocker ses hash généré à l'aide de la fonction PBKDF2. Je veux faire cela en utilisant le château gonflable bibliothèque, mais je ne sais pas pourquoi je ne peux pas le faire fonctionner à l'aide de la JCE de l'interface...
Le problème est que la génération de la valeur de hachage dans 3 modes différents:

1. à l'aide de la PBKDF2WithHmacSHA1 clé secrète de l'usine offerts par la sun

2. en utilisant le château gonflable directement l'api

3. en utilisant le château gonflable par la JCE

résultats dans les 2 valeurs distinctes: une qui est commune pour les deux premiers et un pour le troisième.

Voici mon code:

    //Mode 1

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec keyspec = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
    Key key = factory.generateSecret(keyspec);
    System.out.println(key.getClass().getName());
    System.out.println(Arrays.toString(key.getEncoded()));

    //Mode 2

    PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
    generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(("password").toCharArray()), salt, 1000);
    KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
    System.out.println(Arrays.toString(params.getKey()));

    //Mode 3

    SecretKeyFactory factorybc = SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");
    KeySpec keyspecbc = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
    Key keybc = factorybc.generateSecret(keyspecbc);
    System.out.println(keybc.getClass().getName());
    System.out.println(Arrays.toString(keybc.getEncoded()));
    System.out.println(keybc.getAlgorithm());

Je sais que PBKDF2 est mis en œuvre à l'aide de l'algorithme HMAC SHA1 c'est pourquoi j'ai choisi comme l'algorithme dans la dernière méthode de la "PBEWITHHMACSHA1" que j'ai pris depuis le château gonflable java docs.

Le résultat est le suivant:

com.sun.crypto.provider.SunJCE_ae
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
org.bouncycastle.jce.provider.JCEPBEKey
[14, -47, -87, -16, -117, -31, 91, -121, 90, -68, -82, -31, -27, 5, -93, -67, 30, -34, -64, -40]
PBEwithHmacSHA

Des idées?

  • Je ne suis pas sûr de ce que "Mode 3" est en train de faire, mais je préfère l'ignorer. Il est de sortie est de 160 bits, 128 pas, comme vous l'avez demandé. 160 bits est de la taille d'un hachage SHA-1. Pour la portabilité, je collerais avec le "Mode 1."
  • Je suis d'accord avec erickson - est-il un réel besoin pour vous d'utiliser le "Mode 3" ou "Mode 1" être acceptable pour le stockage en toute sécurité le mot de passe? Bonne question détaillée pour votre première question, ici, par la manière.
  • Il n'est pas nécessaire en effet. J'essaie juste de comprendre pourquoi la PBEWITHHMACSHA1 de BouncyCastle ne pas faire la même chose. Et je suis d'accord, je n'aurais pas choisi la deuxième méthode en raison de problèmes de portabilité.
  • Merci s'accoupler, le numéro 1 de sauver ma vie au travail 😀
InformationsquelleAutor andrei.serea | 2011-12-29