ошибка алгоритмов, поддерживаемых android?
У меня есть шифры шифрования / дешифрования, которые я использую в Android. Он отлично работает на Android 4.4
static void setKey(byte[] keybytes, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
key = new SecretKeySpec(keybytes, "AES");
ivspec = new IvParameterSpec(iv);
encryptcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
encryptcipher.init(Cipher.ENCRYPT_MODE, key,ivspec);
decryptcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
decryptcipher.init(Cipher.DECRYPT_MODE, key,ivspec);
}
Однако всякий раз, когда я запускаю это на Android 4.3, я получаю эту ошибку
07-25 17:17:25.917: W/System.err(27544): java.lang.RuntimeException: java.security.NoSuchAlgorithmException: SecureRandom SHA1PRNG implementation not found
07-25 17:17:25.927: W/System.err(27544): at java.security.SecureRandom.<init>(SecureRandom.java:100)
07-25 17:17:25.927: W/System.err(27544): at javax.crypto.Cipher.init(Cipher.java:564)
07-25 17:17:25.927: W/System.err(27544): at com.chatads.sdk.bm.a(SourceFile:56)
07-25 17:17:25.927: W/System.err(27544): at com.chatads.sdk.x.a(SourceFile:241)
07-25 17:17:25.927: W/System.err(27544): at com.chatads.sdk.ax.run(SourceFile:66)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-25 17:17:25.927: W/System.err(27544): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-25 17:17:25.927: W/System.err(27544): at java.lang.Thread.run(Thread.java:841)
07-25 17:17:25.927: W/System.err(27544): Caused by: java.security.NoSuchAlgorithmException: SecureRandom SHA1PRNG implementation not found
07-25 17:17:25.927: W/System.err(27544): at java.security.Provider$Service.newInstance(Provider.java:1000)
07-25 17:17:25.927: W/System.err(27544): at java.security.SecureRandom.<init>(SecureRandom.java:97)
07-25 17:17:25.927: W/System.err(27544): ... 11 more
07-25 17:17:25.927: W/System.err(27544): Caused by: java.lang.IllegalAccessException: access to class not allowed
07-25 17:17:25.927: W/System.err(27544): at java.lang.Class.newInstanceImpl(Native Method)
07-25 17:17:25.927: W/System.err(27544): at java.lang.Class.newInstance(Class.java:1130)
07-25 17:17:25.927: W/System.err(27544): at java.security.Provider$Service.newInstance(Provider.java:998)
07-25 17:17:25.927: W/System.err(27544): ... 12 more
Я запустил этот код
Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
Log.i("CRYPTO","provider: "+provider.getName());
Set<Provider.Service> services = provider.getServices();
for (Provider.Service service : services) {
Log.i("CRYPTO"," algorithm: "+service.getAlgorithm());
}
}
Найдено здесь Какие крипто алгоритмы поддерживает Android?
Все AES, AES/CBC/PKCS5Padding и SHA1PRNG появились в выходных данных. Это ошибка Андроида? или я делаю что-то не так?
2 ответов:
Я понял, как гарантировать существование алгоритмов, которые мне нужны. Сначала я скачал Spongey Castle и добавил его в свой путь сборки
Я добавил SC в качестве поставщика, используя этот код
static { Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); }После этого у меня все еще была та же ошибка, что и раньше, поэтому я изменил свой код на
static void setKey(byte[] keybytes, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, NoSuchProviderException { /** * crypto is specifically stated here because without using AndroidOpenSSL for the SHA1PRNG breaks on some phones, * PRNGFixes.apply() should be called if using this * https://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html */ random = SecureRandom.getInstance("SHA1PRNG", "Crypto"); key = new SecretKeySpec(keybytes, "AES"); ivspec = new IvParameterSpec(iv); encryptcipher = Cipher.getInstance("AES/CFB/NoPadding", "SC"); encryptcipher.init(Cipher.ENCRYPT_MODE, key, ivspec, random); decryptcipher = Cipher.getInstance("AES/CFB/NoPadding", "SC"); decryptcipher.init(Cipher.DECRYPT_MODE, key, ivspec, random); }Исправлены все мои проблемы, но тогда есть проблема безопасности использования Crypto, поэтому я скачал PRNGFixes, найденные по адресу https://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html и вызвал apply в другом месте приложения, прежде чем я использовал крипто-библиотеку
Простое удаление существующего БК и добавление нового работает для меня
static { Security.removeProvider("BC"); Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider()); }
Comments