Java Cryptography - Tạo Chữ ký

Chữ ký số cho phép chúng ta xác minh tác giả, ngày giờ của chữ ký, xác thực nội dung tin nhắn. Nó cũng bao gồm chức năng xác thực cho các khả năng bổ sung.

Ưu điểm của chữ ký điện tử

Trong phần này, chúng ta sẽ tìm hiểu về các lý do khác nhau kêu gọi việc sử dụng chữ ký điện tử. Có một số lý do để triển khai chữ ký số cho truyền thông -

Xác thực

Chữ ký điện tử giúp xác thực nguồn tin nhắn. Ví dụ, nếu văn phòng chi nhánh của ngân hàng gửi một tin nhắn đến văn phòng trung tâm, yêu cầu thay đổi số dư tài khoản. Nếu văn phòng trung tâm không thể xác thực tin nhắn đó được gửi từ một nguồn được ủy quyền, thì việc thực hiện yêu cầu đó có thể là một sai lầm nghiêm trọng.

Chính trực

Sau khi tin nhắn được ký, bất kỳ thay đổi nào trong tin nhắn sẽ làm mất hiệu lực của chữ ký.

Không bác bỏ

Bởi thuộc tính này, bất kỳ thực thể nào đã ký một số thông tin không thể phủ nhận việc đã ký vào một thời điểm sau đó.

Tạo chữ ký điện tử

Bây giờ chúng ta cùng tìm hiểu cách tạo chữ ký điện tử. Bạn có thể tạo chữ ký số bằng Java theo các bước dưới đây.

Bước 1: Tạo đối tượng KeyPairGenerator

Các KeyPairGenerator lớp học cung cấp getInstance() phương thức chấp nhận một biến Chuỗi đại diện cho thuật toán tạo khóa bắt buộc và trả về một đối tượng KeyPairGenerator tạo khóa.

Tạo nên KeyPairGenerator đối tượng sử dụng getInstance() như hình dưới đây.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Bước 2: Khởi tạo đối tượng KeyPairGenerator

Các KeyPairGenerator lớp cung cấp một phương thức có tên initialize()phương pháp này được sử dụng để khởi tạo bộ tạo cặp khóa. Phương thức này chấp nhận một giá trị số nguyên đại diện cho kích thước khóa.

Khởi tạo đối tượng KeyPairGenerator đã tạo ở bước trước bằng cách sử dụng initialize() như hình dưới đây.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

Bước 3: Tạo KeyPairGenerator

Bạn có thể tạo KeyPair sử dụng generateKeyPair()phương pháp. Tạo cặp khóa bằng cách sử dụnggenerateKeyPair() như hình dưới đây.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

Bước 4: Lấy khóa riêng từ cặp

Bạn có thể lấy khóa cá nhân từ đối tượng KeyPair đã tạo bằng cách sử dụng getPrivate() phương pháp.

Nhận khóa cá nhân bằng cách sử dụng getPrivate() như hình dưới đây.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Bước 5: Tạo đối tượng chữ ký

Các getInstance() phương pháp của Signature lớp chấp nhận một tham số chuỗi đại diện cho thuật toán chữ ký được yêu cầu và trả về đối tượng Chữ ký tương ứng.

Tạo một đối tượng của lớp Chữ ký bằng cách sử dụng getInstance() phương pháp.

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

Bước 6: Khởi tạo đối tượng Chữ ký

Các initSign() phương thức của lớp Chữ ký chấp nhận một PrivateKey và khởi tạo đối tượng Signature hiện tại.

Khởi tạo đối tượng Chữ ký đã tạo ở bước trước bằng cách sử dụng initSign() như hình dưới đây.

//Initialize the signature
sign.initSign(privKey);

Bước 7: Thêm dữ liệu vào đối tượng Chữ ký

Các update() phương thức của lớp Signature chấp nhận một mảng byte đại diện cho dữ liệu được ký hoặc xác minh và cập nhật đối tượng hiện tại với dữ liệu đã cho.

Cập nhật đối tượng Chữ ký đã khởi tạo bằng cách chuyển dữ liệu được ký vào update() phương thức ở dạng mảng byte như hình dưới đây.

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

Bước 8: Tính chữ ký

Các sign() phương pháp của Signature lớp trả về các byte chữ ký của dữ liệu được cập nhật.

Tính toán Chữ ký bằng cách sử dụng sign() như hình dưới đây.

//Calculating the signature
byte[] signature = sign.sign();

Example

Chương trình Java sau đây chấp nhận một thông điệp từ người dùng và tạo ra một chữ ký số cho thông điệp đã cho.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;

public class CreatingDigitalSignature {
   public static void main(String args[]) throws Exception {
      //Accepting text from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter some text");
      String msg = sc.nextLine();
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();
      
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withDSA");
      
      //Initialize the signature
      sign.initSign(privKey);
      byte[] bytes = "msg".getBytes();
      
      //Adding data to the signature
      sign.update(bytes);
      
      //Calculating the signature
      byte[] signature = sign.sign();
      
      //Printing the signature
      System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
   }
}

Output

Chương trình trên tạo ra kết quả sau:

Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?