【问题标题】:SecretKeyFactory.getInstance gives me NoSuchAlgorithmException no matter what algorithm I provide无论我提供什么算法,SecretKeyFactory.getInstance 都会给我 NoSuchAlgorithmException
【发布时间】:2018-03-19 00:19:10
【问题描述】:

所以我一直在看这个页面:https://developer.android.com/reference/javax/crypto/SecretKeyFactory.html

他们似乎声称这些算法中的任何一个都应该与 Android-Studio 中的 SecretKeyFactory 一起使用,但是当我输入这段代码时:

SecretKeyFactory key = SecretKeyFactory.getInstance("Algorithm-Name");

无论我输入的那个 android 网站上列出的算法名称,它总是给我

未处理的异常:java.security.NoSuchAlgorithmException

我在 Eclipse 中使用标准 Java 项目进行了尝试,效果很好。

我也尝试过使用 spongycastle,但这似乎也不起作用。

【问题讨论】:

  • 好吧SecretKeyFactory.getInstance("Algorithm-Name")永远不会工作,是吗?假设您具体并提供了正确行不起作用的代码?
  • 你已经尝试过里面的所有算法了吗?你能告诉我们一个特定的堆栈跟踪吗?您是否可能从运行时更改或删除提供程序?您使用的是什么运行时/SDK?您可以尝试通过迭代运行时中的所有提供程序和服务来列出算法...

标签: java android android-studio cryptography


【解决方案1】:

您的提供程序配置似乎有问题。您可以尝试使用以下代码列出可用的算法:

Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
    boolean printedProvider = false;
    Set<Service> services = provider.getServices();
    for (Service service : services) {
        String algorithm = service.getAlgorithm();
        String type = service.getType();
        if (type.equalsIgnoreCase("SecretKeyFactory")) {
            if (!printedProvider) {
                System.out.printf("%n === %s ===%n%n", provider.getName());
                printedProvider = true;
            }
            System.out.printf("Type: %s alg: %s%n", type, algorithm);
        }
    }
}

如果这不打印任何内容,则为同一运行时创建一个 empty 项目,然后再次运行它。如果它确实显示了一种算法 - 它应该 - 那么您应该确保打印的提供程序在您的项目配置中可用。

如果没有,您真的应该重新安装 SDK 或运行时,因为项目设置存在严重问题。

【讨论】:

  • 还要确保你使用了正确的SecretKeyFactory类;一些提供者模仿了 JCA API 使用的类名结构,导致了一些可怕的编码错误。
猜你喜欢
  • 2014-01-15
  • 2012-08-11
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多