私のアプリでは、CRYPTOプロバイダーを使用して乱数を作成しましたが、Android N では削除されました。アプリが文字列からキーを取得するために setSeed() に依存していた場合は、SecretKeySpec を使用して生のキー バイトを直接ロードするように切り替える必要があります。実際のキー派生関数 (KDF) を使用します。下のリンクによると
原因: java.security.NoSuchProviderException: no such provider: Crypto - Android N
今私の問題は、古いアルゴリズム(SHA1PRNGおよびCRYPTOプロバイダー)でアプリを使用しているすべての既存のユーザーです。すべてのアプリ データは、以下のアルゴリズムを使用して暗号化され、「Shared Preference」および「SQLITE」に保存されています。
新しい暗号化/復号化アルゴリズムを使用してアプリの更新を行うと、保存されたデータを SQLITE および共有設定から復号化するときにアプリがクラッシュする可能性があります
ユーザーに影響を与えることなく、古い暗号化/復号化アルゴリズムを新しいアルゴリズムに移行する方法を提案できますか?
public static String encrypt(String seed, String clearText) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes(STR_ENCODE_UTF8));
byte[] result = encryptDecrypt(rawKey, clearText.getBytes(STR_ENCODE_UTF8), Cipher.ENCRYPT_MODE);
return new String(Base64.encode(toHex(result).getBytes(STR_ENCODE_UTF8), Base64.DEFAULT)).trim();
}
public static String decrypt(String seed, String encrypted) throws Exception {
String decodedStr = new String(Base64.decode(encrypted.trim(), Base64.DEFAULT));
byte[] rawKey = getRawKey(seed.getBytes(STR_ENCODE_UTF8));
byte[] enc = toByte(decodedStr);
byte[] result = encryptDecrypt(rawKey, enc, Cipher.DECRYPT_MODE);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) throws NoSuchAlgorithmException, NoSuchProviderException {
KeyGenerator kGen = KeyGenerator.getInstance(KEY_GENERATOR_ALGORITHM);
SecureRandom sr = SecureRandom.getInstance(STR_SHA1PRNG, CRYPTO);
sr.setSeed(seed);
kGen.init(128, sr);
SecretKey sKey = kGen.generateKey();
byte[] raw = sKey.getEncoded();
return raw;
}