如何找出我的JVM支持哪种算法[加密]?

时间:2010-09-10 08:53:16

标签: 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 = "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。

参考:http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28java.lang.String%29

现在,当您评论'setAlgorithm'时,它将使用默认算法[我猜它是md5],它将正常工作。这意味着我的JVM支持md5。现在,如何找出我的JVM支持的其他加密算法。

谢谢,

6 个答案:

答案 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()