Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将密钥与sqlcipher一起使用_Android_Sqlcipher_Sqlcipher Android - Fatal编程技术网

Android 将密钥与sqlcipher一起使用

Android 将密钥与sqlcipher一起使用,android,sqlcipher,sqlcipher-android,Android,Sqlcipher,Sqlcipher Android,我正在使用sqlcipher来存储我的应用程序中的数据,首先我遇到了问题,生成了一个密钥,然后存储在密钥库中 顺便说一句,需要没有用户交互,如中所述 下面是我如何尝试产生这个秘密 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey key = keyGen.generateKey(); 这里是我设置sqldatabase的地方 SQLiteDatabase db = SQLiteD

我正在使用sqlcipher来存储我的应用程序中的数据,首先我遇到了问题,生成了一个密钥,然后存储在密钥库中

顺便说一句,需要没有用户交互,如中所述

下面是我如何尝试产生这个秘密

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey key = keyGen.generateKey();
这里是我设置sqldatabase的地方

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(databaseFile, "password_string", null);

所以问题是,我如何使用密码字符串中的密码?目前,我只能以字节数组的形式获取机密。

请查找以下使用AES加密/解密的实用程序。您可以使用密钥对密码进行加密/解密。但是,我不建议这样做,因为您还必须存储密钥,而且问题仍然存在,如何安全地保存密钥?在这种情况下,常用的做法是使用哈希函数:SHA-256、MD5。。。将密码散列并存储。稍后,当您想要检查用户是否输入了正确的密码时,只需对他们输入的内容进行散列,并与您存储的值进行比较

private static int BLOCKS = 128;

  public static byte[] encryptAES(String seed, String cleartext)
      throws Exception {
    byte[] rawKey = getRawKey(seed.getBytes("UTF8"));
    SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    return cipher.doFinal(cleartext.getBytes("UTF8"));
  }

  public static byte[] decryptAES(String seed, byte[] data) throws Exception {
    byte[] rawKey = getRawKey(seed.getBytes("UTF8"));
    SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    return cipher.doFinal(data);
  }

  private static byte[] getRawKey(byte[] seed) throws Exception {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(seed);
    kgen.init(BLOCKS, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    return raw;
  }

这是我生成随机和准安全密码的方法:

fun generatePassword(): String{
     val androidId = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)

     val passPassphraseBase = "${BuildConfig.APPLICATION_ID}_$androidId:"

     val random = SecureRandom()
     val salt = ByteArray(32)
     random.nextBytes(salt)

     val passPhrase = passPassphraseBase.toByteArray() + salt

     val pass = Base64.encodeToString(passPhrase, Base64.NO_WRAP)

     return pass
} 
你可以问我需要什么应用程序ID和Android ID。 只是为了增加密码的熵(也许还有长度)

然后我将此密码加密存储在共享首选项中。 我使用密钥库RSA算法加密所有共享首选项密钥和值

毕竟,我们最终生成的对称加密密码是用非对称算法加密的

所有这些都只是一个白盒密码,我们将密钥和加密数据存储在一个地方

如果我们为至少部分密码添加一些外部源,我们可以提高安全性。 为此,我们可以使用:

  • 我们后端的东西
  • 用户输入或生物识别

忘了提一下,我正在密钥库中存储。所以我可以使用
byte[]raw=skey.getEncoded()
获取原始机密并将其传递给sqlcipher。谢谢