引入

Provider 是研究密码学的第一步,它表示了对于JAVA安全框架的一种实现。对于JDK,它有许多默认的实现,当然了,你也可以不满意其默认的实现,而使用第三方或者自己根据API 开发SPI 然后提供自己的实现。


分析:

对于JDK默认的Provider,它们都在$JAVA_HOME/jre/lib/security目录下java.security文件中:

164910800.png

而默认的JDK提供了9种Provider如下:

密码学研究-Provider_第1张图片

我们可以通过JCA中的API 来获取这些Provider的信息:


package com.charles.securitysearch;
import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import java.util.Set;
/**
 * Provider Usage Demo
 *@author cwang58
 *@created date: Oct 23, 2013
 */
public class ProviderSearch {
                                                                                                     
    /**
     * get all the providers of current JDK
     * @return
     */
    public static String getAllProviders(){
        StringBuilder sb = new StringBuilder();
        for (Provider provider: Security.getProviders()){
            sb.append(getProviderInformation(provider)).append("\n");
                                                                                                             
        }
        return sb.toString();
    }
                                                                                                     
    /**
     * get the information of a given provider
     * @param provider
     * @return
     */
    private static String getProviderInformation(Provider provider){
                                                                                                         
        StringBuilder sb = new StringBuilder();
        sb.append("Provider Name:").append(provider.getName()).append("\n");
        sb.append("Provider Version:").append(provider.getVersion()).append("\n");
        sb.append("provider Info:").append(provider.getInfo()).append("\n").append("\n");
        return sb.toString();
                                                                                                         
                                                                                                         
    }
                                                                                                     
    public static void main(String[] args){
                                                                                                         
        System.out.println("Display all Providers in current JDK");
        System.out.println(getAllProviders());
                                                                                                         
                                                                                                         
                                                                                                         
                                                                                                     
                                                                                                         
                                                                                                         
    }
                                                                                                         
}


显示结果如下:

密码学研究-Provider_第2张图片


显然,这个结果和我们在$JAVA_HOME/jre/lib/security中看到的是一致的。


后话:

而如果我们不想要JDK默认的provider,那么我们可以有两种方式添加,一个是编辑java.security文件,按照顺序在后面加上自己需要的provider类,另外一种方式就是用java.security.Security类的addProvider()和removeProvider()方法就可以完成了