我想要的是使用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
。
这不可能吗?
===关于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;
}
答案 0 :(得分:0)
好吧,四处走走。 一种密码方案,用于加密密码的AES密钥存储在密钥库中。
在此解决方案中有一个开销,就在这里。
由于密钥库是特定于设备的,因此当用户尝试登录新设备时,将通过电子邮件/ SMS对其进行验证。如果用户通过了验证,则可以告诉用户输入新密码(或相同的文本),然后在新设备上创建另一个密钥库别名。
因此,总而言之,您的应用是特定于设备的,如果用户要在另一台设备上使用它,则必须先进行验证,然后用户才能使用相同的文本/另一文本。