Java 加密 - 建立簽名



數字簽名允許我們驗證簽名的作者、日期和時間,並對訊息內容進行身份驗證。它還包括身份驗證功能以提供其他功能。

Creating Signature

數字簽名的優勢

在本節中,我們將學習需要使用數字簽名的不同原因。實施數字簽名通訊的原因有很多:

認證

數字簽名有助於對訊息來源進行身份驗證。例如,如果銀行的分支機構向中央辦公室傳送訊息,請求更改賬戶餘額。如果中央辦公室無法驗證該訊息是否來自授權來源,則執行此類請求可能會造成嚴重錯誤。

完整性

訊息一旦簽名,任何更改都會使簽名無效。

不可否認性

根據此屬性,任何簽署某些資訊的主體以後都不能否認已簽署該資訊。

建立數字簽名

現在讓我們學習如何建立數字簽名。您可以按照以下步驟使用 Java 建立數字簽名。

步驟 1:建立 KeyPairGenerator 物件

KeyPairGenerator 類提供 getInstance() 方法,該方法接受一個表示所需金鑰生成演算法的字串變數,並返回一個生成金鑰的 KeyPairGenerator 物件。

使用 getInstance() 方法建立 KeyPairGenerator 物件,如下所示。

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

步驟 2:初始化 KeyPairGenerator 物件

KeyPairGenerator 類提供了一個名為 initialize() 的方法,此方法用於初始化金鑰對生成器。此方法接受一個表示金鑰大小的整數值。

使用 initialize() 方法初始化上一步中建立的 KeyPairGenerator 物件,如下所示。

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

步驟 3:生成 KeyPairGenerator

您可以使用 generateKeyPair() 方法生成 KeyPair。使用 generateKeyPair() 方法生成金鑰對,如下所示。

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

步驟 4:從金鑰對中獲取私鑰

您可以使用 getPrivate() 方法從生成的 KeyPair 物件中獲取私鑰。

使用 getPrivate() 方法獲取私鑰,如下所示。

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

步驟 5:建立簽名物件

Signature 類的 getInstance() 方法接受一個表示所需簽名演算法的字串引數,並返回相應的 Signature 物件。

使用 getInstance() 方法建立 Signature 類的物件。

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

步驟 6:初始化簽名物件

Signature 類的 initSign() 方法接受一個 PrivateKey 物件並初始化當前的 Signature 物件。

使用 initSign() 方法初始化上一步中建立的 Signature 物件,如下所示。

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

步驟 7:將資料新增到簽名物件

Signature 類的 update() 方法接受一個表示要簽名或驗證的資料的位元組陣列,並使用給定的資料更新當前物件。

透過將要簽名的資料以位元組陣列的形式傳遞給 update() 方法,更新初始化的 Signature 物件,如下所示。

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

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

步驟 8:計算簽名

Signature 類的 sign() 方法返回更新資料的簽名位元組。

使用 sign() 方法計算簽名,如下所示。

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

示例

以下 Java 程式接受使用者輸入的訊息併為給定訊息生成數字簽名。

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"));
   }
}

輸出

上述程式生成以下輸出:

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

© . All rights reserved.