2012-02-22 18 views
6

Sau đây là một mã mà sẽ mã hóa chuỗi user:Phương thức cập nhật của MessageDigest làm và BASE64Encoder có nghĩa là gì?

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import sun.misc.BASE64Encoder; 
import java.io.*; 

class Encrypter { 
public synchronized String encrypt(String plainText) throws Exception { 
    MessageDigest md = null; 
    try { 
     md = MessageDigest.getInstance("SHA"); 
    }catch(Exception exc) { 
     throw new Exception(exc.getMessage()); 
    } 

    try { 
     md.update(plainText.getBytes("UTF-8")); 
    }catch(Exception exc) { 
     throw new Exception(exc.getMessage()); 
     } 

     byte raw[] = md.digest(); 
     String hash = (new BASE64Encoder()).encode(raw); 
     return hash; 
} 
public static void main(String args[]) { 
    try { 
     Encrypter encrypter = new Encrypter(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String userInput = br.readLine(); 
     String encryptedPassword = encrypter.encrypt(userInput); 
     System.out.println(encryptedPassword); 
    } catch(Exception exc) { 
     System.out.println(exc); 
     } 
} 
} 

Khi tôi biên dịch mã tôi nhận được những cảnh báo này:

Encrypter.java:4: warning: BASE64Encoder is internal proprietary API and may be removed in a future release 
import sun.misc.BASE64Encoder; 
     ^
Encrypter.java:23: warning: BASE64Encoder is internal proprietary API and may be removed in a future release 
       String hash = (new BASE64Encoder()).encode(raw); 
           ^
2 warnings 

Có phương pháp nào khác để mã hóa chuỗi trong java?

Phương pháp update của lớp MessageDigest làm gì? tức là tuyên bố md.update(plainText.getBytes("UTF-8")); làm gì?

Lớp học BASE64Encoder là gì? Tôi không thể tìm thấy đó là DOC

+2

"Mã hóa" cho thấy hoạt động có thể đảo ngược. Đây là * băm * (với SHA trong trường hợp này). –

+2

Bạn cũng có thể sử dụng '[DatatypeConverter.printBase64Binary (byte [])'] (http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/DatatypeConverter.html#printBase64Binary (byte [])) – Zaki

Trả lời

11
  1. Trước hết, bạn không thực hiện bất kỳ mã hóa nào. Bạn đang tính toán băm một chiều hoặc thông báo đầu vào của bạn. Băm này có thể được sử dụng sau này để xác minh tính toàn vẹn của thông báo. Xem Hashing, SHA1MessageDigest.

  2. Base64 encoding là phương thức biểu thị dữ liệu nhị phân trong ASCII. Điều này thường được mong muốn vì không phải tất cả các cơ chế lưu trữ và truyền dữ liệu đều hỗ trợ nhị phân thô. Ví dụ: nếu bạn muốn chuyển tiêu hóa đã tính của mình thông qua tham số chuỗi truy vấn http, bạn sẽ muốn mã hóa nó dưới dạng Base64. Ngoài ra, việc lưu hoặc in nhị phân thô vào bảng điều khiển sẽ tạo ra một luồng các ký tự funky có thể nằm ngoài phạm vi có thể in và cũng có thể tạo ra tiếng bíp từ loa PC của bạn!

  3. Base64Encoder bạn đang sử dụng đến từ gói sun.misc và KHÔNG BAO GIỜ được sử dụng. Đây là mã Sun JVM nội bộ có thể có hoặc không có sẵn trong tương lai. Điều đó cũng giải thích tại sao bạn không thể tìm thấy bất kỳ javadoc nào.

  4. May mắn thay, một số bộ mã hóa và giải mã Base64 miễn phí và mở tồn tại. Apache Commons Codec là một thư viện được sử dụng rộng rãi và ổn định có chứa một số codec bao gồm Base64.

  5. md.update(plainText.getBytes("UTF-8")) cập nhật đầu vào cho thông báo. Gọi digest sẽ thực hiện cập nhật cuối cùng và tính toán thông báo đầu vào. Xem javadoc của md.digestmd.update

+0

để '' md.digest' trả về mảng giá trị nhị phân? –

+0

Có, 'md.digest' trả về một' byte [] 'với thông báo thô ở dạng nhị phân. –

1

Đối với mã hóa Base64 và giải mã cảnh báo này nói rõ ràng rằng nó không khuyến khích sử dụng Sun thực hiện Base64Encoder và đưa ra một cảnh báo rằng việc thực hiện có thể được gỡ bỏ trong các phiên bản tương lai, những gì chúng ta có thể làm là chuyển sang thực hiện khác bộ mã hóa Base64. Chúng tôi có thể sử dụng Commons Codec library cho bộ mã hóa Base64. Sau đây là ví dụ:

1. Add Commons Codec library in classpath of your project 
2. Add import statement for Base64 Class. 

import org.apache.commons.codec.binary.Base64; 

3. Encrypt your data 

String testString = "Hello World"; 
byte[] encodedBytes = Base64.encodeBase64(testString.getBytes()); 
// Get encoded string 
String encodedString = new String(encodedBytes); 
// Get decoded string back 
String decodedString = new String(Base64.decodeBase64(encodedBytes)); 

Sau khi sử dụng thư viện codec của Commons, bạn sẽ không thấy cảnh báo trên nữa.

Các vấn đề liên quan