Как хранить закрытый ключ в Android без пин-кода

Я новичок в Android и безопасности.

Мое приложение использует зашифрованную БД, которая зашифрована закрытым ключом. Я хочу найти способ хранить этот закрытый ключ в защищенном месте, без добавления дополнительного пароля / пин-кода.

Из того, что я прочитал, хранилище ключей Android - это место, где я могу это сделать, но, насколько я понимаю, если я буду его использовать, оно потребует, чтобы я установил пин-код для устройства (чего я не хочу делать).!).

Любые предложения относительно того, где хранить этот ключ и как? (любое решение, связанное с хранилищем ключей, является приемлемым, если мне не нужно устанавливать пин-код)

Мое направление - использовать внешнее хранилище ключей с открытым исходным кодом (какие-либо предложения?), Которые я скомпилирую как часть моего приложения (и потому что android не делится информацией между приложениями, это будет нормально использовать).

Я знаю, что мое последнее предположение неверно при использовании рутированного устройства, но в моем случае я использую только некорневые устройства.

Я много искал (здесь и в других местах) и не мог найти то, что искал...

Любая помощь высоко ценится!! 10x

1 ответ

Вам нужно иметь в виду, что KeyChain недоступно до API 14. Если вы хотите настроить таргетинг на более ранние версии API, вам нужен другой вариант. Вы можете использовать SpongyCastle для создания собственного хранилища ключей.

Если вы не собираетесь запрашивать пароль у пользователя, вы должны как минимум скрыть пароль.

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        KeyStore ks = null;
        try {
            ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(null,null);

            // Add certs or keys

            ks.store(new FileOutputStream(new File(getFilesDir(),"out.bks")),"password".toCharArray());
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static {
        Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
    }
}
Другие вопросы по тегам