2010-09-10 46 views
29

我正在使用Jasypt進行加密。這是我的代碼:如何找出我的JVM支持哪種算法[加密]?

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: 加密提出了一個excep重刑。一個 可能的原因是您使用強 加密算法和你沒有 安裝Java加密防爆 張力(JCE)無限強度 權限策略文件在這個Java 虛擬機

阿比說:

設置要使用的算法對加密 設置算法用於加密 ,像 PBEWithMD5AndDES。

該算法(如果指定一個, 或默認JVM提供商,如果你 不行),並且,如果支持,你 還可以指定模式和填充的要由 您的JCE提供支持它就像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支持的其他加密算法。

感謝,

回答

36

下面將列出所有的提供者和算法的支持者。你使用的是什麼版本的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())); 

2)創建一個Cipher使用

cipher = Cipher.getInstance(algorithm); 

3)初始的密碼與鑰匙

cipher.init(Cipher.ENCRYPT_MODE, key); 

4)執行加密生成Key

byte[] encrypted = cipher.doFinal(data) 
+0

我使用代替JDK 1.6 – 2010-09-10 10:54:52

+4

內容:System.out.println( 「算法:」 + service.getAlgorithm());使用System.out.println(「」+ service);並且您將能夠看到可用的加密級別。例如,以下表示支持128位AES加密,但不支持256位AES:SunJCE:Cipher.AES - > com.sun.crypto.provider.AESCipher ... SupportedModes = ECB | CBC | PCBC | CTR | CTS | CFB | OFB | CFB8 | CFB16 | CFB24 | CFB32 | CFB40 | CFB48 | CFB56 | CFB64 | OFB8 | OFB16 | OFB24 | OFB32 | OFB40 | OFB48 | OFB56 | OFB64 | CFB72 | CFB80 | CFB88 | CFB96 | CFB104 | CFB112 | CFB120 | CFB128 | OFB72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128} – 2011-10-14 15:36:36

+0

該代碼列出了很多不能使用的算法。沒有那麼有用的代碼。 – Jonas 2018-01-16 15:59:38

1

Qwerky仍然有一個'正在等待'的問題:爲什麼使用Jasypt而不是使用javax.crypto?

那麼,我會建議使用Jasypt,因爲它是一種簡單的加密方式,適合初學者和高度可配置的有經驗的用戶。

使用Jasypt,您可以快速利用javax.crypto並瞭解JCE和加密技術。無論您是想管理用戶密碼還是加密/解密數據,框架都會提供一個簡單的抽象概念。

同時,該框架公開了JCE規範的所有可能性,以允許有經驗的用戶完全控制。

除此之外,Jasypt提供了更多的功能外的現成的衆所周知的問題(處理存儲在數據庫中,敏感數據......)

+0

如果他想問一個問題,他不應該把它放在一個答案。這不是討論主題 – Mick 2012-02-15 17:49:41

4

的Jasypt命令行工具現在來有一個腳本用於執行此操作,稱爲listAlgorithms.bat用於Linux,listAlgorithms.sh用於Linux。

你可以找到關於如何下載和在這裏使用它的說明:http://www.jasypt.org/cli.html#Listing_algorithms

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()); 
    } 
} 
相關問題