/** 获取当前所有提供者 */ public static void getAllProviders() { for (Provider provider : Security.getProviders()) { System.out.println("provider name:" + provider.getName()); for (Map.Entry<Object, Object> map : provider.entrySet()) { System.out.println("key=" + map.getKey()); System.out.println("value=" + map.getValue()); } } }
/** * Makes sure all provider properties either point to a class implementation that exists or are * aliases to known algorithms. */ public void test_Provider_Properties() throws Exception { /* * A useful reference on Provider properties * <a href="http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.html> * How to Implement a Provider in the Java ™ Cryptography Architecture * </a> */ Provider[] providers = Security.getProviders(); for (Provider provider : providers) { // check Provider.id proprieties assertEquals(provider.getName(), provider.get("Provider.id name")); assertEquals(String.valueOf(provider.getVersion()), provider.get("Provider.id version")); assertEquals(provider.getInfo(), provider.get("Provider.id info")); assertEquals(provider.getClass().getName(), provider.get("Provider.id className")); // build map of all known aliases and implementations Map<String, String> aliases = new HashMap<String, String>(); Map<String, String> implementations = new HashMap<String, String>(); for (Entry<Object, Object> entry : provider.entrySet()) { Object k = entry.getKey(); Object v = entry.getValue(); assertEquals(String.class, k.getClass()); assertEquals(String.class, v.getClass()); String key = (String) k; String value = (String) v; // skip Provider.id keys, we check well known ones values above if (key.startsWith("Provider.id ")) { continue; } // skip property settings such as: "Signature.SHA1withDSA ImplementedIn" "Software" if (key.indexOf(' ') != -1) { continue; } Matcher m = alias.matcher(key); if (m.find()) { String type = m.group(1); aliases.put(key, type + "." + value); } else { implementations.put(key, value); } } // verify implementation classes are available for (Entry<String, String> entry : implementations.entrySet()) { String typeAndAlgorithm = entry.getKey(); String className = entry.getValue(); try { assertNotNull(Class.forName(className, true, provider.getClass().getClassLoader())); } catch (ClassNotFoundException e) { // Sun forgot their own class if (!className.equals("sun.security.pkcs11.P11MAC")) { fail("Could not find class " + className + " for " + typeAndAlgorithm); } } } // make sure all aliases point to some known implementation for (Entry<String, String> entry : aliases.entrySet()) { String alias = entry.getKey(); String actual = entry.getValue(); assertTrue( "Could not find implementation " + actual + " for alias " + alias, implementations.containsKey(actual)); } } }