sha256 || java || string byte[] converterings problem.
Hejsan!
Så jag håller på att frächa upp java:n men stött på lite problem som jag tror sker i denna metod (Tror det är Integer.parseInt() som ställer tilldet):
public static byte[] stringToHashByteVal(String toConvert) {
byte[] b = new byte[toConvert.length() / 2];
for (int i = 0; i < b.length; i++) {
int index = i * 2;
int v = Integer.parseInt(toConvert.substring(index, index + 2), 16);
b[i] = (byte) v;
}
return b;
}
Så det jag gör just nu är helt enkelt att jag hash ett "lösenord" via sha256 som lagras i databas tillsammans med idividuelt salt i en hex sträng (dvs 64 tecken lång) sedan när jag ska konverta tillbaka till en byte[] för att jämföra med "användar" input lösen (sträng) så tror jag det blir fel. Min exempel kod nedan:
HashHandler:
package database;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.Random;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public class HashHandling {
private static final Random RANDOM = new SecureRandom();
private static final int ITERATIONS = 10000;
private static final int KEY_LENGTH = 256;
private static byte[] idSalt = getNextSalt();
public static byte[] getNextSalt() {
byte[] salt = new byte[16];
RANDOM.nextBytes(salt);
return salt;
}
public static byte[] passwordHashing(char[] password, byte[] salt) {
PBEKeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH);
Arrays.fill(password, Character.MIN_VALUE);
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
return skf.generateSecret(spec).getEncoded();
} catch(NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new AssertionError("Error whil hashing a password: "+e.getMessage(), e);
} finally {
spec.clearPassword();
}
}
public static boolean isExpectedPassword(char[] password, byte[] salt, byte[] expectedHash) {
byte[] pwdHash = passwordHashing(password, salt);
Arrays.fill(password, Character.MIN_VALUE);
if(pwdHash.length != expectedHash.length) {
return false;
}
for(int i = 0; i < pwdHash.length; i++) {
if(pwdHash[i] != expectedHash[i]) {
return false;
}
}
return true;
}
public static byte[] idHashing(char[] id) {
return passwordHashing(id, idSalt);
}
public static String hashToString(byte[] toConvert) {
return String.format("%064x", new BigInteger(1, toConvert));
}
public static byte[] stringToHashByteVal(String toConvert) {
byte[] b = new byte[toConvert.length() / 2];
for (int i = 0; i < b.length; i++) {
int index = i * 2;
int v = Integer.parseInt(toConvert.substring(index, index + 2), 16);
b[i] = (byte) v;
}
return b;
}
}
Nuvarande main för test:
package main;
import database.DatabaseHandler;
import database.HashHandling;
import database.PostTableRow;
import database.UsersTableRow;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import database.TableRow;
public class Main {
public static void main(String[] args) throws Exception{
byte[] salt = HashHandling.idHashing(HashHandling.hashToString(HashHandling.getNextSalt()).toCharArray());
String orgiPw = new String("test");
byte[] hashPw = HashHandling.passwordHashing(orgiPw.toCharArray(), salt);
String HashStr = HashHandling.hashToString(hashPw);
byte[] conBack = HashHandling.stringToHashByteVal(HashStr);
if(HashHandling.isExpectedPassword(conBack.toString().toCharArray(), salt, hashPw)) {
System.out.println("Converter seam to work.");
} else {
System.out.println("Failed");
System.out.println("\t Conback:\t"+conBack.toString());
System.out.println("\t Orgi: \t"+hashPw.toString());
}
}
}
Någon som har förslag på lösning för att kunna konvertera mellan byte[] och 64 length "hex sträng"??
Tack för svar!
Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6