32

我正在使用 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 虚拟机中安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files

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 支持的其他加密算法。

谢谢,

4

6 回答 6

43

以下将列出所有提供者和算法支持者。您使用的是什么版本的 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)
于 2010-09-10T10:36:48.957 回答
4

Jasypt 命令行工具现在带有一个用于执行此操作的脚本,称为listAlgorithms.batWindows 和listAlgorithms.shLinux。

您可以在此处找到有关如何下载和使用它的说明:http ://www.jasypt.org/cli.html#Listing_algorithms

于 2014-05-20T19:27:22.960 回答
3

如果您还没有安装它,那么您需要安装为算法提供支持的 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

于 2010-09-10T09:26:25.587 回答
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());
    }
}
于 2014-07-27T10:05:06.877 回答
1

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

好吧,我建议使用 Jasypt,因为它对于初学者来说是一种简单的加密方式,对于有经验的用户来说是高度可配置的。

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

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

除此之外,Jasypt 还为众所周知的问题提供了更多开箱即用的功能(处理存储在数据库中的敏感数据,...)

于 2012-01-24T11:50:14.707 回答
0

使用 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);
于 2021-06-11T08:53:16.753 回答