Java 如何找出我的JVM支持什么算法[加密]?
我正在使用Jasypt进行加密。这是我的代码: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
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}该代码列出了许多无法使用的算法。不是很有用的代码。如果他想问一个问题,他不应该把它放在答案里。这不是一个讨论主题