我正在使用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 : 加密提出了一个例外。一个 可能的原因是你使用强大 加密算法,你没有 安装了Java Cryptography Ex 紧张(JCE)无限的力量 此Java中的管辖区域策略文件 虚拟机
api说:
设置要使用的算法 加密将算法设置为 用于加密,比如 PBEWithMD5AndDES。
此算法必须得到支持 你的JCE提供者(如果你指定一个, 或者是默认的JVM提供程序 不要),如果它得到支持,你 也可以指定模式和填充 它,如ALGORITHM / MODE / PADDING。
现在,当您评论'setAlgorithm'时,它将使用默认算法[我猜它是md5],它将正常工作。这意味着我的JVM支持md5。现在,如何找出我的JVM支持的其他加密算法。
谢谢,
答案 0 :(得分:38)
以下将列出所有提供程序和算法支持者。您使用的是哪个版本的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 key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
2)使用
创建Cipher
cipher = Cipher.getInstance(algorithm);
3)使用密钥
启动密码cipher.init(Cipher.ENCRYPT_MODE, key);
4)使用
进行加密byte[] encrypted = cipher.doFinal(data)
答案 1 :(得分:4)
Jasypt命令行工具现在附带了一个脚本,用于执行此操作,对于Windows称为listAlgorithms.bat
,对于Linux称为listAlgorithms.sh
。
您可以在此处找到有关如何下载和使用它的说明:http://www.jasypt.org/cli.html#Listing_algorithms
答案 2 :(得分:2)
如果您尚未安装它,则需要安装JCE(Java Cryptography Extension),它为算法提供支持。
您可以在此处查看如何安装:
http://download.oracle.com/javase/1.4.2/docs/guide/security/CryptoSpec.html#ProviderInstalling
图书馆可以在这里找到: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html
答案 3 :(得分:2)
我尝试了@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());
}
}
答案 4 :(得分:1)
Qwerky还有一个“未决”问题:为什么使用Jasypt而不是使用javax.crypto?
好吧,我建议使用Jasypt,因为它是一种为初学者加密的简单方法,对于有经验的用户来说是高度可配置的。
使用Jasypt,您可以通过对JCE和加密技术的一点了解,快速开始利用javax.crypto。无论您是要管理用户密码还是加密/解密数据,该框架都为问题提供了简单的抽象。
同时,该框架公开了JCE规范的所有可能性,以允许有经验的用户完全控制。
除此之外,Jasypt为众所周知的问题提供了更多开箱即用的功能(处理存储在数据库中的敏感数据,......)
答案 5 :(得分:0)
使用 Java 8 及更高版本,
axs[i].set_yscale("log", base=2)
axs[i].yaxis.set_major_locator(LogLocator(base=2))
axs[i].yaxis.set_minor_locator(LogLocator(base=2))
axs[i].plot(x, y)
plt.show()