如何在sqlite android中存储哈希密码

时间:2017-04-27 22:16:28

标签: java android sqlite hash cryptography

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),这个方法包含上面的代码但不起作用。 我完全没有线索。请帮忙。

1 个答案:

答案 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。

希望这有帮助!

最好,费德里科。