protected static byte[] getHashedKey(String password,String MODE)throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
saltIV = new byte[48];
salt = new byte[32];
ivBytes =new byte[16];
if(MODE.equals("CREATE_VAULT")){
//generate salt ,iv & save them
salt = generateSalt();
ivBytes = generateIV();
System.arraycopy(salt, 0, saltIV, 0, salt.length);
System.arraycopy(ivBytes, 0, saltIV, salt.length, ivBytes.length);
//save salt & iv
//FileOutputStream saltIvOutFile = new FileOutputStream("C:\\saltIv.ats");
//saltIvOutFile.write(saltIV);
//saltIvOutFile.close();
}
if(MODE.equals("OPEN_VAULT")){
FileInputStream saltIvInFile = new FileInputStream("C:\\saltIv.ats");
saltIvInFile.read(saltIV);
saltIvInFile.close();
System.arraycopy(saltIV, 0, salt, 0, salt.length);
System.arraycopy(saltIV, salt.length, ivBytes, 0, ivBytes.length);
}
// Derive the key
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
PBEKeySpec spec = new PBEKeySpec(
password.toCharArray(),
salt,
pswdIterations,
keySize
);
SecretKey secretKey = factory.generateSecret(spec);
return secretKey.getEncoded();
}
这是生成散列密码的地方
尝试{
String finalKey = Arrays.toString(androCrypter.getHashedKey(v.password,"CREATE_VAULT"));
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
boolean vaultCreationSuccessful = new TableController(context).addNewVault(finalKey,v.vaultName,v.algorithm);
这是我将散列保存为字符串并将其插入数据库的地方 但它永远不会被保存.sqlite列是TEXT类型。我知道sqlite支持直接保存字节数组,所以我尝试使用byte []但是结果相同,数据库中没有条目。 addVault没有任何问题()代码,因为我已经用其他普通字符串检查了它,所有,它工作得很好。 这是代码
protected boolean addNewVault(String finalKey,String vaultName,String algorithm) {
ContentValues values = new ContentValues();
values.put("Vault_Name", vaultName);
values.put("KEY", finalKey);
values.put("Algorithm", algorithm);
SQLiteDatabase db = this.getWritableDatabase();
boolean createSuccessful = db.insert(DATABASE_NAME, null, values) > 0;
db.close();
return createSuccessful;
}
但在这种情况下,我无法让它工作。没有得到保存。我也读到了BLOB但我认为它不需要因为在sqlite中支持byte []。 怎么了 ? 任何帮助/建议都会非常感激。谢谢。
注意:请忽略getHashedKey()中的FileInputStream和FileOutputtream行;
编辑: 我刚想通了这个
try {
finalKey = Arrays.toString(androCrypter.getHashedKey(v.password,"CREATE_VAULT"));
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
代码没有被执行就是问题。我创建了另一个类只是为了检查它是否在那里工作而且确实如此。 尝试了另一种方法,并调用它像finalKey = getFinalKey(v.password),这个方法包含上面的代码但不起作用。 我完全没有线索。请帮忙。
答案 0 :(得分:0)
我要做的是将“byte []”转换为String:
String hashAsString = new String(hashAsBytes,"UTF-8");
其中“hashAsBytes”是“getHashedKey”的结果,“hashAsString”是您的字节数组转换为String。
然后你可以根据需要在数据库中保存“hashAsString”。
然后比较哈希:
public boolean compareHashes(String hashInDB, String hashNew){
return hashInDB.equals(hashNew);
}
如果您的hashInDB等于刚刚计算的新哈希,则此方法将返回TRUE。如果散列不匹配,则返回FALSE。
希望这有帮助!
最好,费德里科。