Android KeyStore问题,另一个设备使用相同的应用程序

时间:2019-03-19 07:20:33

标签: java android keystore

我想要的是使用android keystore,以便我想隐藏加密密钥。

这是代码。

    String alias = "testalias";
    KeyStoreManager.init(getApplicationContext());
    String plain = "helloWorld";
    String enc = KeyStoreManager.encryptData(plain, alias);
    Log.d(TAG, "enc = " + enc);

我将enc字符串保存到名为encText的变量中,然后再次运行。

String alias = "testalias";
KeyStoreManager.init(getApplicationContext());
String plain = "helloWorld";
String enc = KeyStoreManager.encryptData(plain, alias);
Log.d(TAG, "enc = " + enc);
String encText = "AcasR3G2Oai+Misqcsacw0Fmnj96vrEqV0Cdmc3ycT2FoEvmVZFAk6ZyG+Srww26R+slDl/32a/D\n" +
            "uaQQQxBqbW0uO5pwUL5HIFb3WBiPm1dh5JsHfQ==";
String dec = KeyStoreManager.decryptData(encText, alias);
// dec : helloWorld

它已正确解码。

但是,此问题在其他设备上发生。在另一台设备上解密encText会导致PaddingException

这不可能吗?

  1. 设备'A'->使用KeyStore加密文本。
  2. 设备'B'->使用KeyStore解密该文本。 ->例外 (使用相同的.jks,相同的应用,相同的代码)

===关于Keystoremanager ===

基于 java.security.KeyStore 的Keystoremanager类 使用* .jks文件

public String encryptString(String alias, String plainText) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, IOException, UnrecoverableEntryException, KeyStoreException, InvalidAlgorithmParameterException {
    String encryptedText = "";
    createKeys(context, alias);
    KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null);
    RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();

    Cipher inCipher = getCipher();
    inCipher.init(Cipher.ENCRYPT_MODE, publicKey);

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, inCipher);
    cipherOutputStream.write(plainText.getBytes(CHARSET));
    cipherOutputStream.close();

    byte[] vals = outputStream.toByteArray();
    encryptedText = (Base64.encodeToString(vals, Base64.DEFAULT));

    return encryptedText;
}

1 个答案:

答案 0 :(得分:0)

好吧,四处走走。 一种密码方案,用于加密密码的AES密钥存储在密钥库中。

在此解决方案中有一个开销,就在这里。

由于密钥库是特定于设备的,因此当用户尝试登录新设备时,将通过电子邮件/ SMS对其进行验证。如果用户通过了验证,则可以告诉用户输入新密码(或相同的文本),然后在新设备上创建另一个密钥库别名。

因此,总而言之,您的应用是特定于设备的,如果用户要在另一台设备上使用它,则必须先进行验证,然后用户才能使用相同的文本/另一文本。