Tạo và sử dụng chữ ký số trong java (Bài 10)

Bài học tạo và sử dụng chữ ký số trong java sẽ bao gồm tổng quan về chữ ký số, thực hành chữ ký số với Java.

Tương tự như chữ ký truyền thống, chữ ký số được sử dụng để ký trên các tài liệu dạng file (bản mềm). Chữ ký kỹ thuật số không chỉ được dùng xác minh rằng tài liệu không bị thay đổi mà còn giúp xác định tác giả của tài liệu.

Hai mục đích của chữ ký số là bảo đảm tính toàn vẹn của tài liệu và xác minh tính xác thực của người gửi.

Tạo và sử dụng chữ ký số trong java – Quá trình hoạt động

Tương tự như mã hoá và giải mã dữ liệu là sử dụng cặp khoá public key và private key. Tuy nhiên đối với chữ ký số, private key được người gửi sử dụng để ký trên tài liệu muốn gửi (quá trình mã hoá dữ liệu).

Nếu người nhận nhận được dữ liệu này, họ sẽ sử dụng public key để xác thực tài liệu có phải được gửi từ đối tác hay không (quá trình giải mã).

Tạo và sử dụng chữ ký số trong java – Chương trình mẫu

Xử lý tạo cặp khoá

try {
 SecureRandom sr = new SecureRandom();
 KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
 kpg.initialize(1024, sr);
 KeyPair keys = kpg.generateKeyPair();

 // Save private key
 PrivateKey privateKey = keys.getPrivate();
 FileOutputStream fos = new FileOutputStream("d:/file/ds/priKey.bin");
 fos.write(privateKey.getEncoded());
 fos.close();

 // Save public key
 PublicKey publicKey = keys.getPublic();
 fos = new FileOutputStream("d:/file/ds/pubKey.bin");
 fos.write(publicKey.getEncoded());
 fos.close();

 JOptionPane.showMessageDialog(this, "Register key successfully");
} catch (Exception e) {
 e.printStackTrace(); 
}

Xử lý ký số

try { 
 // Nạp private key từ file
 FileInputStream fis = new FileInputStream("d:/file/ds/priKey.bin");
 byte[] b = new byte[fis.available()];
 fis.read(b);
 fis.close();
 
 // Tạo private key
 PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b);
 KeyFactory factory = KeyFactory.getInstance("DSA");
 PrivateKey priKey = factory.generatePrivate(spec);
 //********************************

 //Ký số (Sign)***************************
 // Tạo đối tượng signer
 Signature s = Signature.getInstance("DSA");
 s.initSign(priKey, new SecureRandom());

 // Chọn file để thực hiện ký số 
 String filename = "d:/file/test.docx";
 fis = new FileInputStream(filename);
 byte byteFile[] = new byte[fis.available()];

 // Chèn message vào đối tượng signer
 signer.update(byteFile);
 byte[] bsign = signer.sign();
 
 // Lưu chữ ký số
 FileOutputStream fos = new FileOutputStream("d:/file/ds/dsa");
 fos.write(bsign);  
 //*******************************

 System.out.println("Sign document successfully");
} catch (Exception e) {
  e.printStackTrace(); 
}

Xử lý kiểm chứng

try { 
 // Nạp public key từ file
 FileInputStream fis = new FileInputStream("d:/file/ds/pubKey.bin");
 byte[] b = new byte[fis.available()];
 fis.read(b);
 fis.close(); 

 // Tạo public key
 X509EncodedKeySpec spec = new X509EncodedKeySpec(b);
 KeyFactory factory = KeyFactory.getInstance("DSA");
 PublicKey pubKey = factory.generatePublic(spec);
 
 // Khởi tạo đối tượng Signature
 Signature s = Signature.getInstance("DSA");
 s.initVerify(pubKey);

 // Chọn file để kiểm chứng 
 String filename = "c:/file/test.doc";

 fis = new FileInputStream(filename);
 byte byteFile[] = new byte[fis.available()];
 fis.close();

 // Nạp message vào đối tượng Signuture
 s.update(byteFile);

 / Kiểm chứng chữ ký trên Message
 // Nạp chữ ký signature từ file
 fis = new FileInputStream("d:/file/ds/dsa");
 byte[] bsign = new byte[fis.available()];
 fis.read(bsign);
 fis.close();

 // Kết quả kiểm chứng
 boolean result = s.verify(bsign);
 if (result == true) {
     System.out.println("Message is verified");
  else {
     System.out.println("Message isn't verified");
 }
}

Tạo và sử dụng chữ ký số trong java – Bài tập thực hành

Thiết kế giao diện

tao va su dung chu ky so trong java 1

Xử lý

Nút “Register key“: Tạo cặp khoá. Xử lý cho nút “Sign“: Tạo chữ ký số. Xử lý cho nút “Verify“: Kiểm chứng tài liệu