Thứ Bảy, 6 tháng 9, 2014

[Java Security] Phần 6 : Message Digests

Phần 6 : Message Digests
Message Digest (MD) là một loại hàm đặc biệt, có thể xem nó như hash function (hàm băm), one-way function (hàm một chiều).  Bạn có thể ví MD như 1 cái máy cắt giấy, khi giấy đã đưa vào máy thì rất khó để hồi phục lại tình trạng ban đầu. Bởi vậy, khi mã hóa sử dụng MD thì rất khó, cũng có thể nói là không thể nào giải mã được. Bạn sẽ hỏi “Oh, mã hóa được mà giải mã không được thì dùng để làm gì ?” Lý do là, sử dụng MD để tạo ra một giá trị duy nhất cho một thông điệp.
Ví dụ, giả sử bạn muốn gởi thông điệp đến người môi giới chứng khoán :”mua 500 cổ phần của ABC”. Trước khi gởi, bạn cho thông điệp này qua MD để tạo ra một mã khóa thông điệp , thông điệp này gọi là giá trị băm 1. Sau đó, bạn gởi cả thông điệp và giá trị băm 1 này đến người môi giới. Dọc đường, một kẻ gian chặn thông điệp này và thay đổi thành 5.000 cổ phần. Khi thông điệp này đến tay người môi giới, anh ta thực hiện cùng MD trên thông điệp của bạn cho ra giá trị băm 2, sau đó anh ta so sánh giá trị băm 1 và giá trị băm 2. Nếu giống nhau đó là thông điệp ban đầu, còn ngược lại thông điệp đã bị chỉnh sửa.   
Hiện nay, hầu hết các website, sử dụng MD để mã hóa password của 1 username và lưu lại trong database. Mỗi khi username đăng nhập, website lại sử dụng MD để mã hóa password , sau đó so sánh giá trị này với giá trị được lưu lại trong database.
Thuật toán secret-key, public-key được sử dụng để mã hóa thông điệp dưới dạng thông điệp không muốn công khai. Còn trong message digest, thông điệp phải được công khai và chứng minh thông điệp đó chính xác từ người gởi.
Thuật toán Message Digest 5 (MD5)Secure Hash Algorithm 1 (SHA-1) là những thuật toán nổi tiếng dành cho message digest và cả 2 thuật toán này đều được hổ trợ trong java :
- MD5 là một hàm message digest được phát triển bởi Ron Rivest, trước MD5 có MD1,MD2,MD3,MD4 nhưng hiện tại MD5 là thông dụng và phổ biến nhất. MD5 hoạt động trên các thông điệp có chiều dài tùy ý và cung cấp 128-bit (16-byte) message digest.
- SHA-1 là một hàm message digest được phát triển NIST, hoạt động trên các thông điệp có kích thước lên tới 264 bits và cung cấp 160-bit message digest.
I. Message Digest trong Java :
Java hổ trợ 5 class trong gói java.security dành cho Message Digest:
- class MessageDigestSpi : là một abstract class, cung cấp một service provider (1 service provider tương ứng với 1 thuật toán nào đó về message digest) để phát triển các class MessageDigest.
- class MessageDigest : class này được kế thừa từ MessageDigestSpi mà cung cấp sự thực hiện cơ bản về message digest.
- class DigestInputStream :   tạo một message digest từ dữ liệu mà được đọc từ 1stream .
- class DigestOutputStream : tạo ra message digest từ dữ liệu mà được ghi từ 1 stream.
- class Digestxception :  ghi lại lỗi trong quá trình tạo message digest mà bị lỗi.
1. Class MessageDigest :
Class này hổ trợ 2 thuật toán Message Digest phổ biến là MD5SHA. Class này gói gọn những sự tính toán phức tạp để đưa ra những phần cơ bản nhất đến người dùng về message digest.
Class này cung cấp phương thức getInstance() để tạo đối tượng MessageDigest, phương thức này nhận 1 giá trị tham số đầu vào kiểu String chỉ ra tên thuật toán dành cho MD , các giá trị này là :
Ví dụ : MessageDigest md = MessageDigest.getInstace(“MD5”);
Một số các phương thức  thông dụng khác của class MessageDigest:
+ void update(byte input) :  tạo lại digest  bởi byte được chỉ ra.
+ void update(byte[] input) : tạo lại digest bởi mảng byte chỉ ra.
+ void update(byte[] input, int offset, int len) : tạo lại digest bởi sử dụng 1 phần chỉ ra của 1 mảng byte.
+ byte[] digest() : trả về giá trị của digest dưới dạng 1 mảng byte.
2.class DigestInputStream và DigestOutputStream :
DigestInputStream được sử dụng để tạo ra một message digest trên các byte mà được đọc từ stream. DigestOutputStream được sử dụng để tạo ra một message digest trên các byte mà được ghi từ stream.
a. DigestInputStream :
Hàm dựng (constructor) nhận vào 2 tham số : đối tượng InputStream và MessageDigest
Trong đó:
- Đối tượng InputStream là 1 Stream mà dựa trên stream đó để tạo digest.
- Đối tượng MessageDigest được tạo bởi sử dụng phương thức getInstance() của class MessageDigest.
Một số phương thức của DigestInputStream:
b. DigestOutputStream:
Hàm dựng (constructor) nhận vào 2 tham số : đối tượng OutputStream và MessageDigest
Trong đó :
- Đối tượng OutputStream là 1 Stream mà dựa trên stream đó để tạo digest.
- Đối tượng MessageDigest được tạo bởi sử dụng phương thức getInstance() của class MessageDigest.
Một số phương thức của DigestOutputStream:
3. Ví dụ 1 MessageDigest trong chương trình java :
4. ví dụ 2 message digest trong java:

Không có nhận xét nào:

Đăng nhận xét