gpt4 book ai didi

java - 如何在 sqlite android 中存储散列密码

转载 作者:行者123 更新时间:2023-11-29 02:41:38 25 4
gpt4 key购买 nike

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) 一样调用它并且此方法包含上述代码但不起作用。我完全不知道。请帮忙。

最佳答案

我要做的是将“byte[]”转换为字符串:

String hashAsString = new String(hashAsBytes,"UTF-8");

其中“hashAsBytes”是“getHashedKey”的结果,“hashAsString”是转换为字符串的字节数组。

然后您只需将“hashAsString”保存在您的数据库中,只要您认为合适即可。

然后比较哈希:

public boolean compareHashes(String hashInDB, String hashNew){
return hashInDB.equals(hashNew);
}

如果您的 hashInDB 等于您刚刚计算的新哈希值,此方法将返回 TRUE。如果哈希值不匹配,它将返回 FALSE。

希望这对您有所帮助!

最好的,费德里科。

关于java - 如何在 sqlite android 中存储散列密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com