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
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