2010-09-10 33 views
29

Tôi đang sử dụng Jasypt để mã hóa. Đây là mã của tôi:Cách tìm hiểu thuật toán [mã hóa] nào được JVM của tôi hỗ trợ?

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); 
    } 

} 

Bỏ ghi chú dòng setAlgorithm và nó sẽ ném một ngoại lệ

org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption nhướn tion excep. Một nguyên nhân có thể là bạn đang sử dụng mạnh mẽ thuật toán mã hóa và bạn chưa cài đặt Java Cryptography Ex căng thẳng (JCE) Unlimited Strength Policy Thẩm quyền tập tin trong này Java Virtual Machine

api nói:

Đặt thuật toán được sử dụng để mã hóa Đặt thuật toán là được sử dụng để mã hóa, như PBEWithMD5AndDES.

thuật toán này phải được hỗ trợ bởi nhà cung cấp JCE của bạn (nếu bạn chỉ định một, hoặc nhà cung cấp JVM mặc định nếu bạn không), và nếu nó được hỗ trợ, bạn cũng có thể chỉ chế độ và đệm cho , như ALGORITHM/MODE/PADDING.

tham khảo: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28java.lang.String%29

Bây giờ, khi bạn nhận xét 'setAlgorithm' nó sẽ sử dụng mặc định Algorithm [i đoán nó là md5], và nó sẽ hoạt động tốt. Điều đó có nghĩa là md5 được hỗ trợ bởi JVM của tôi. Bây giờ, làm thế nào để tìm hiểu các thuật toán mã hóa khác được hỗ trợ bởi JVM của tôi.

Cảm ơn,

Trả lời

36

Sau đây sẽ liệt kê tất cả các nhà cung cấp và các thuật toán người ủng hộ. Bạn đang sử dụng phiên bản Java nào? Trừ khi bạn đang ở trên một phiên bản cũ JCE nên được bao gồm như là tiêu chuẩn.

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()); 
      } 
     } 

    } 
} 

Chỉnh sửa: Bất kỳ lý do nào bạn không sử dụng công cụ chuẩn từ gói javax.crypto?

1) Tạo một Key sử dụng

Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray())); 

2) Tạo một Cipher sử dụng

cipher = Cipher.getInstance(algorithm); 

3) init mật mã của bạn với phím

cipher.init(Cipher.ENCRYPT_MODE, key); 

4) Làm mã hóa với

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

tôi đang sử dụng jdk 1.6 –

+4

Thay vì: System.out.println ("Thuật toán:" + service.getAlgorithm()); sử dụng System.out.println ("" + dịch vụ); và bạn sẽ có thể thấy mức độ mã hóa có sẵn. Ví dụ, sau đây chỉ ra rằng mã hóa AES 128 bit được hỗ trợ, nhưng không phải là 256 bit AES: SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher ... SupportedModes = ECB | CBC | PCBC | CTR | CTS | CFB | CFB24 | CFB32 | CFB32 | CFB48 | CFB32 | CFB40 | OFB8 | OFB16 | OFB24 | OFB32 | OFB40 | OFB48 | OFB56 | OFB64 | CFB72 | CFB80 | CFB88 | CFB96 | CFB104 | CFB112 | CFB120 | OFB88 | OFB96 | OFB104 | OFB1 | OFB120 | OFB128} –

+0

Mã danh sách rất nhiều thuật toán không thể sử dụng. Mã không hữu ích lắm. – Jonas

1

Vẫn còn câu hỏi 'đang chờ xử lý' được hỏi bởi Qwerky: tại sao sử dụng Jasypt thay vì sử dụng javax.crypto?

Vâng, tôi khuyên bạn nên sử dụng Jasypt vì đây là cách đơn giản để mã hóa cho người mới bắt đầu và có thể cấu hình cao cho người dùng có kinh nghiệm.

Với Jasypt, bạn có thể bắt đầu nhận lợi ích của javax.crypto nhanh chóng với một chút kiến ​​thức về JCE và mật mã. Cho dù bạn muốn quản lý mật khẩu người dùng hoặc mã hóa/giải mã dữ liệu, khung công tác đều cung cấp một trừu tượng đơn giản cho câu hỏi.

Đồng thời, khung làm nổi bật tất cả các khả năng của đặc tả JCE để cho phép người dùng có kinh nghiệm có toàn quyền kiểm soát.

Thêm vào đó, Jasypt cung cấp nhiều tính năng hơn out-of-the-box cho câu hỏi nổi tiếng (xử lý dữ liệu nhạy cảm được lưu trữ trong cơ sở dữ liệu, ...)

+0

Nếu anh ta muốn đặt câu hỏi, anh ta không nên đặt câu trả lời. Đây không phải là một chuỗi thảo luận – Mick

4

Các Jasypt công cụ dòng lệnh bây giờ đến với một tập lệnh để thực hiện việc này được gọi là listAlgorithms.bat cho các cửa sổ và listAlgorithms.sh cho Linux.

Bạn có thể tìm hướng dẫn về cách tải về và sử dụng nó ở đây: http://www.jasypt.org/cli.html#Listing_algorithms

2

tôi đã cố gắng mã đăng bởi @Qwerky, nhưng nó không phải là rất hữu ích. Tôi đã thêm nhà cung cấp BouncyCastle mới nhất và kết quả tôi nhận được rất khó hiểu. Điều này cho thấy chi tiết hơn ai là nhà cung cấp, phiên bản và loại và tên thuật toán.

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()); 
    } 
} 
Các vấn đề liên quan