SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA512”) jette NoSuchAlgorithmException
Après un peu de recherche et un peu de travail que j'ai finalement été en mesure de hachage sel le mot de passe maintenant, il est une question qui est sur mon esprit j'ai utilisé le SHA1 méthode et je voudrais essayer d'utiliser le SHA512, car on m'a dit que c'est mieux (plus sécurisé) donc voici mon code son un peu partout, mais je pense que c'est compréhensible donc:
public class Safety
{
//calling some parameters for possible later changes
public static final String algorithm = "PBKDF2WithHmacSHA1";
public static final int saltbytesize = 24;
public static final int hashbytesize = 24;
public static final int iterations = 1000;
public static final int iIndex = 0;
public static final int sIndex = 1;
public static final int pbkIndex = 2;
public static Users passwordHash(Users user) throws NoSuchAlgorithmException,
InvalidKeySpecException
{
SecureRandom sR = new SecureRandom();
byte[] pws = new byte[saltbytesize];
sR.nextBytes(pws);
byte[] pwh = pbkdf2(user.getPassword().toCharArray(), pws, iterations, hashbytesize);
user.setPassword(toHex(pwh));
byte[] sas = new byte[saltbytesize];
sR.nextBytes(sas);
byte[] sah = pbkdf2(user.getsA().toCharArray(), sas, iterations, hashbytesize);
user.setsA(toHex(sah));
user.setUserhash(pws);
user.setSahash(sas);
return user;
}
public static boolean hashpassword(String username, String password, Users user)
throws NoSuchAlgorithmException,
InvalidKeySpecException
{
byte[] pws = user.getUserhash();
byte[] pwh = pbkdf2(password.toCharArray(), pws, iterations, hashbytesize);
String searcher = toHex(pwh) + username;
String searched = user.getPassword() + user.getUsername();
if (searcher.equals(searched))
{
return true;
}
return false;
}
private static byte[] pbkdf2(char[] password, byte[] salt,
int iterations, int bytes)
throws NoSuchAlgorithmException, InvalidKeySpecException
{
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
return skf.generateSecret(spec).getEncoded();
}
private static String toHex(byte[] array)
{
BigInteger bi = new BigInteger(1, array);
String hex = bi.toString(16);
int paddingLength = (array.length * 2) - hex.length();
if (paddingLength > 0)
return String.format("%0" + paddingLength + "d", 0) + hex;
else
return hex;
}
}
Donc voilà mon code, cependant, je n'ai pas été capable de faire SHA512 et j'ai déjà essayé public static final String algorithm = "PBKDF2WithHmacSHA512"
mais ça ne semble pas être la bonne chaîne pour l'algorithme, car il jette les pas d'un tel algorithme exception.
Je souhaite également la bienvenue changements qui pourraient rendre le code mieux.
comme indiqué ci-dessus!
pertinentes de quelques ligne(s) de code
public static final String algorithme = "PBKDF2WithHmacSHA512"<<<<<
Je vous remercie et je sais que mais la façon dont je bidouille genre hors des limites de ma capacité à le faire paraître jolie.
pas vraiment. le code que vous avez collé n'est pas aligné l'espacement et les états financiers résumés, etc. à tout le moins corrigé que pour être agréable à la question-answerers =)
Travaille 🙂
Il fixe. Le principal problème avec votre code de mise en forme semble avoir été onglets - il devrait y jamais être onglets dans le code, et l'édition d'affichage et la sortie peuvent utiliser différents taquets de tabulation, de sorte que le retrait peut avoir un aspect différent. Aussi, si vous utilisez un décent IDE (dire NetBeans), c'est plutôt difficile d'écrire du code sans avoir décent mise en forme.
OriginalL'auteur Fahadalkadhi95 | 2013-12-27
Vous devez vous connecter pour publier un commentaire.
Qui n'est pas possible de sortir de la zone de
L'OpenJDK mise en œuvre ne fait que fournir un PBKDF2HmacSHA1Factory.java qui a la "HmacSHA1" digérer harcoded. Autant que j'ai testé, l'Oracle JDK n'est pas différent en ce sens.
Ce que vous avez à faire est de tirer la
PBKDF2HmacSHA1Factory
(allez, c'est ouvrir!) et d'ajouter un paramètre de son constructeur. Vous pouvez éviter le gâchis de la création de votre propreProvider
, et initialiser et utiliser votre usine comme suit:Oui. Malgré son nom, la "clé" est en fait la sortie de la PBKDF. Un attaquant ne peut pas (mais par force brute) dériver le mot de passe d'origine de la "clé".
encore une chose que j'ai dû poser la question avant de la main quand quelqu'un se connecte à ce que j'ai à faire est de récupérer la clé et le sel et le hachage de nouveau?plus correctement qu'est-ce que l'utilisation de la clé? ou est-il réellement le hachage de mot de passe, et je suis trop épais pour comprendre?
Je pense que les changements sont insignifiants: vous avez besoin d'une usine pour PBKDF avec "HmacSHA512", de classe
PBKDF2HmacSHA1Factory
est une usine de PBKDF avec "HmacSHA1": copier la source, le renommer, remplacer "HmacSHA1" par "HmacSHA512", et une heureuse nouvelle année.Java 8 est maintenant PBKDF2HmacSHA512 disponibles docs.oracle.com/javase/8/docs/technotes/guides/security/...
OriginalL'auteur Javier