Java加密类型和算法名称

项目里有各种加密方法,但从来没有仔细研究过。一般只是copy。这几天遇到一些问题,看了一下加密代码,觉得有些疑惑。

我们知道jdk已经为我们包装好了很多的算法。但究竟包装了哪些算法,怎么去掉这些算法我并没有去查过。今天跟了一下源码,大概知道了。

首先要从下面这几行代码说起:

KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); Java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");

    对于AES加密,我们用KeyGenerator kgen = KeyGenerator.getInstance("AES");,MD5我们用java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");,这里从方法上看出java类是通过一个算法名称去找的,比如AES,但源码中并没有把算法名称包装为枚举,我们无法得知KeyGenerator除了有AES算法,还能获得那些算法,而且如何获得KeyGenerator的算法名称,比如AES不全是大写会不会有问题,KeyGenerator是不是有MD5等等。

打开KeyGenerator.getInstance()方法,看其源码

public static final KeyGenerator getInstance(String paramString) throws NoSuchAlgorithmException { return new KeyGenerator(paramString); }

我们发现直接调用了构造方法,查看构造方法:

private KeyGenerator(String paramString) throws NoSuchAlgorithmException { this.algorithm = paramString; List localList = GetInstance.getServices("KeyGenerator", paramString); this.serviceIterator = localList.iterator(); this.initType = 1; if (nextSpi(null, false) == null) { throw new NoSuchAlgorithmException(paramString + " KeyGenerator not available"); } if ((!skipDebug) && (pdebug != null)) { pdebug.println("KeyGenerator." + paramString + " algorithm from: " + this.provider .getName()); } }

构造方法其实是通过GetInstance.getServices("KeyGenerator", paramString)去找到,继续跟进

public Provider.Service getService(String paramString1, String paramString2) { for (int i = 0; i < this.configs.length; i++) { Provider localProvider = getProvider(i); Provider.Service localService = localProvider.getService(paramString1, paramString2); if (localService != null) { return localService; } } return null; }

    GetInstance.getServices其实是遍历所有的Provider,然后按顺序返回第一个有这个算法服务的Provide的算法服务(Provider.Service)。这里可以看出,寻找服务需要两个参数,第一个参数是type,比如"KeyGenerator",第二个是算法名称,“AES”。那现在我们只要知道有哪些Provide,每个Provide里有哪些Provider.Service就可以了。

    在jdk的API中,查看 KeyGenerator.getInstance方法,其中给了我们提示:

Java加密类型和算法名称

我们可以本地写一个方法遍历jdk所有的算法:

package com.hongkang.test;

import java.security.Provider;
import java.security.Security;
import java.security.Provider.Service;

public class TestSecurity {

   
public static void main(String[] args) {
        Provider[] providers
= Security.getProviders();
       
for(Provider p:providers){
            System.out.println(
"provider name:"+p.getName());
           
for(Service s:p.getServices()){
                System.out.println(
"类型:"+s.getType()+",算法:"+s.getAlgorithm());
            }
            System.out.println(
"--------------------------");
        }
    }
}

输出结果:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fe2971efbf5c69747ddc0e30c73c298c.html