我正在使用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.centeptignoperationNotpossibleException:加密提出了一个外观。一个可能的原因是您使用了强加密算法,并且您尚未安装Java Vertemption polistdiction Policy Policy Policy Policy Policy Policy Policy Policy Policy Policy nish Java Virtual Machine中

API说:

设置用于加密的算法集集用于加密的算法,例如PbewithMd5andDES。

该算法必须由JCE提供商(如果您指定一个或默认的JVM提供商)支持该算法,如果不支持,则该算法也可以为其指定模式和填充,例如算法/模式/padding 。

参考: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/standardpbestringencryctor.html#setalgorithm;

现在,当您评论“ setAlgorithm”时,它将使用默认算法[我猜是MD5],并且可以正常工作。这意味着MD5得到了我的JVM的支持。现在,如何找出我的JVM支持其他哪些加密算法。

谢谢,

有帮助吗?

解决方案

以下将列出所有提供商和算法支持者。您正在使用什么版本的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)

其他提示

JASYPT命令行工具现在带有一个用于执行此操作的脚本 listAlgorithms.bat 对于Windows和 listAlgorithms.sh 对于Linux。

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

如果尚未安装它,则需要安装JCE(Java加密扩展程序),该JCE为算法提供支持。

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

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

我尝试了@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());
    }
}

Qwerky仍然有一个“待处理”问题:为什么要使用jasypt而不是使用javax.crypto?

好吧,我建议使用JASYPT,因为这是用于初学者加密货币的一种简单方法,并且可以为有经验的用户配置高度配置。

使用JASYPT,您可以在JCE和密码学方面稍微了解Javax.Crypto。无论您要管理用户密码还是加密/解密数据,该框架都为问题提供了简单的抽象。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top