原因:java.security.NoSuchProviderException:没有这样的提供商:Crypto - Android N

Caused by: java.security.NoSuchProviderException: no such provider: Crypto - Android N

似乎 "Crypto" 提供商已在 Android N 中删除。

我的应用程序因 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();

04-30 04:07:02.872: E/AndroidRuntime(17386): 原因: java.security.NoSuchProviderException: 没有这样的提供者: Crypto

引用 Google:

The “Crypto” security provider has been removed. Any call to the Java Cryptography Extension (JCE) APIs with a Provider listed should only be done if the provider is included in the code of the APK or be able to deal with it’s absence. The reason applications use this provider is to take advantage of its SecureRandom implementation. If your app was relying on setSeed() to derive keys from strings, you should switch to using SecretKeySpec to load raw key bytes directly OR use a real key derivation function (KDF).

因此,这是按预期工作的。

If I change the provider and Algorithm then it will affect user who are all using the app currently.

您似乎只使用该提供商来生成随机数。因此,切换到不同的随机数生成器,并按照 Google 的说明进行操作,如果我理解正确的话,这应该不会影响现有用户。

而且,如果我误解了您的使用方式 Crypto(因为我很少直接使用 JCE),请开发一个迁移路径,将您应用程序的现有用户升级到不同的算法。 Android N 应该在接下来的几个月内不会以生产形式发布,即便如此,吸收速度也会很慢。