Java 如何找出我的JVM支持什么算法[加密]?

Java 如何找出我的JVM支持什么算法[加密]?,java,encryption,jvm,jasypt,Java,Encryption,Jvm,Jasypt,我正在使用Jasypt进行加密。这是我的代码: public class Encryptor { private final static StandardPBEStringEncryptor pbeEncryptor = new StandardPBEStringEncryptor(); private final static String PASSWORD = "FBL"; private final static String ALGORITHM = "P

我正在使用Jasypt进行加密。这是我的代码:

public class Encryptor {    
    private final static StandardPBEStringEncryptor pbeEncryptor = new StandardPBEStringEncryptor();
    private final static String PASSWORD = "FBL";
    private final static String ALGORITHM = "PBEWithMD5AndTripleDES";

    static{
        pbeEncryptor.setPassword( PASSWORD );
        //pbeEncryptor.setAlgorithm( ALGORITHM );       
    }

    public static String getEncryptedValue( String text ){
        return pbeEncryptor.encrypt( text );
    }

    public static String getDecryptedValue( String text ){
        return pbeEncryptor.decrypt( text );
    }

}
取消注释
setAlgorithm
行,它将引发异常

org.jasypt.exceptions.EncryptionOperationNotPossibleException: 加密引起了一个例外。A. 可能的原因是您使用的是strong 加密算法和你没有 安装了Java加密Ex 张力(JCE)无限强度 此Java中的辖区策略文件 虚拟机

api说:

设置要用于的算法 加密将算法设置为 用于加密,例如 pbewithmd5和des

此算法必须由 您的JCE提供程序(如果您指定一个, 或者默认的JVM提供程序(如果需要) 不要)并且,如果它得到支持,您可以 还可以为指定模式和填充 它就像算法/模式/填充一样

参考:

现在,当您注释“setAlgorithm”时,它将使用默认算法[我猜它是md5],并且它将工作得很好。这意味着我的JVM支持md5。现在,如何找到我的JVM支持的其他加密算法


谢谢,

如果您还没有安装它,那么您需要安装JCE(Java加密扩展),它为算法提供支持

您可以在此处看到如何安装:

可在以下位置找到该库:

以下将列出所有提供程序和算法支持程序。您使用的是什么版本的Java?除非您使用的是旧版本,否则JCE应该作为标准包括在内

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

public class SecurityListings {
    public static void main(String[] args) {
        for (Provider provider : Security.getProviders()) {
            System.out.println("Provider: " + provider.getName());
            for (Provider.Service service : provider.getServices()) {
                System.out.println("  Algorithm: " + service.getAlgorithm());
            }
        }

    }
}
编辑: 您为什么不使用javax.crypto包中的标准内容

1) 使用生成一个

Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
cipher = Cipher.getInstance(algorithm);  
2) 使用创建
密码

Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
cipher = Cipher.getInstance(algorithm);  
3) 用密钥初始化密码

cipher.init(Cipher.ENCRYPT_MODE, key);  
4) 进行加密

byte[] encrypted = cipher.doFinal(data)

Qwerky仍然提出一个“悬而未决”的问题:为什么要使用Jasypt而不是javax.crypto

嗯,我建议使用Jasypt,因为它对于初学者来说是一种简单的加密方法,对于经验丰富的用户来说是高度可配置的

有了Jasypt,您就可以开始快速利用javax.crypto,只需稍微了解JCE和密码学。无论您是想要管理用户密码还是加密/解密数据,该框架都为这个问题提供了一个简单的抽象

同时,该框架公开了JCE规范的所有可能性,允许有经验的用户完全控制


除此之外,Jasypt还为众所周知的问题(处理存储在数据库中的敏感数据,…)提供了许多现成的功能。

Jasypt命令行工具现在提供了一个脚本,用于windows的名为
listAlgorithms.bat
,用于Linux的名为
listAlgorithms.sh


您可以在这里找到有关如何下载和使用它的说明:

我尝试了@Qwerky发布的代码,但没有太大帮助。我添加了最新的BouncyCastle提供程序,结果非常混乱。这将更详细地显示谁是提供者、版本以及算法类型和名称

for (Provider provider : Security.getProviders()) {
    System.out.println("Provider: " + provider.getName() + " version: " + provider.getVersion());
    for (Provider.Service service : provider.getServices()) {
        System.out.printf("  Type : %-30s  Algorithm: %-30s\n", service.getType(), service.getAlgorithm());
    }
}

使用Java 8及以上版本

Stream.of(Security.getProviders()).flatMap(mapper -> Stream.of(mapper.getServices())).flatMap(Set::stream)
                .map(Provider.Service::getAlgorithm).distinct().sorted().forEach(System.out::println);

而不是:System.out.println(“算法:+service.getAlgorithm());使用System.out.println(“+service”);您将能够看到可用的加密级别。例如,以下说明支持128位AES加密,但不支持256位AES:SunJCE:Cipher.AES->com.sun.crypto.provider.aesciper。。。支持性商业模式=ECB | CBC | CBC | CBCよECB | CFB 8 | CFB8 | CFB8 | CBB=ECB=ECB | CBC | CBC | CBC | CBB | CFB | CFB床床床床床床床床床床| CFB | CFB |床床床床床1244 | CFB 8 | CFB 8 1244 | CFB8 |床床床床床床床床床床床床床8 1244 1244 1244 1244 | CFB8 1244 1244 1244 | 72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128}该代码列出了许多无法使用的算法。不是很有用的代码。如果他想问一个问题,他不应该把它放在答案里。这不是一个讨论主题