19 thg 12, 2009

Chứng thực MD5withRSA

  • MD5withRSA được coi là chữ kí điện tử tiêu chuẩn hiện nay và là sự kết hợp của việc mã hóa bất đối xứng RSA và checksum MD5.
  • Mô hình RSA:



    Được  gọi là mã hoá công khai
    Không đối xứng vì khoá dùng để mã hoá khác với khoá dùng để giải mã
    Mỗi người sẽ có một bộ khoá: PublicPrivate
    Public key được công khai
    Private key phải được giữ bí mật
    Mã hoá bằng khoá này thì có thể giải mã bằng khoá kia  
  • MD5 là thuật toán checksum, hash dữ liệu 1 chiều.

    Giá trị sau khi Hash là duy nhất đối với dữ liệu vào. Bất cứ một sự thay đổi nhỏ nào của dữ liệu vào đều dẫn đến kết quả khác
    Không thể khôi phục lại dữ liệu nguyên bản từ giá trị sau khi Hash
  • Thực hiện kí trên một tài liệu:

    Thực hiện hash nội dung tài liệu bằng MD5.
    Dùng private key mã hóa kết quả sau khi hash.
    Thông tin được mã hóa gọi là chữ kí điện tử(Digital signal).

  • Quá trình kiểm tra gồm 2 bước:

    Sử dụng public key của người gửi để giải mã chữ kí được X1.
    Sử dụng MD5 để hash nội dung nhận được được X2.
    So sánh X1 và X2 để xác nhận chữ kí đúng hay sai.
  • Ứng dụng thử nghiệm sử dụng java:

SignatureUtil.java
Nguyen Xuan Tuan
package com.ftl.obg.util;

import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.security.cert.Certificate;

import com.ftl.util.*;

/**
 * 
Title: FTL - MSB - GATEWAY
* 
Description: 
* 
Copyright: (c) 2009
* 
Company: FTL Global
* @author TuanNX
 * @version 1.0
 */
public class SignatureUtil
{
 /**
  *
  * @param sign Signature
  * @param source String
  * @return byte[]
  */
 public static byte[] signMessage(Signature sign, String source)
 {
  try
  {
   sign.update(source.getBytes());
   return sign.sign();
  }
  catch(Exception ex1)
  {
   ex1.printStackTrace();
  }
  return null;
 }

 /**
  * verifyMessage
  *
  * @param verifier PrivateKey
  * @param data String
  * @param signature String
  * @return String
  */
 public static boolean verifyMessage(Signature verifier, byte[] data,byte[] signature)
 {
  try
  {
   verifier.update(data);
   return verifier.verify(signature);
  }
  catch(Exception ex1)
  {
   ex1.printStackTrace();
  }
  return false;
 }

 /**
  *
  * @param signatureAlgorithmName String, ex:MD5withRSA, NONEwithRSA
  * @param strKeyStorePath String
  * @param strKeyStorePassword String
  * @param strKeyAlias String
  * @param strKeyAliasPassword String
  * @return Signature
  * @throws Exception
  */
 public static Signature createSigner(String keyStoreType, String signatureAlgorithmName,
     String strKeyStorePath,String strKeyStorePassword,
     String strKeyAlias,String strKeyAliasPassword) throws Exception
 {
  KeyStore keyStore = null;
  if(keyStoreType != null && keyStoreType.equals(""))
   keyStore = KeyStore.getInstance(keyStoreType);
  else
   keyStore = KeyStore.getInstance(KeyStore.getDefaultType());//"JKS");
  InputStream is = null;
  try
  {
   is = new FileInputStream(strKeyStorePath);
   keyStore.load(is,strKeyStorePassword.toCharArray());
  }
  finally
  {
   StreamUtil.safeClose(is);
  }
  Signature verifier = Signature.getInstance(signatureAlgorithmName);
  verifier.initSign((PrivateKey)keyStore.getKey(strKeyAlias,strKeyAliasPassword.toCharArray()));
  return verifier;
 }

 /**
  *
  * @param signatureAlgorithmName String
  * @param strCertificatePath String
  * @return Signature
  * @throws Exception
  */
 public static Signature createVerifier(String keyCerStoreType, String signatureAlgorithmName, String strCertificatePath) throws Exception
 {
  java.security.cert.CertificateFactory factory = CertificateFactory.getInstance(keyCerStoreType);
  Certificate cer = null;
  InputStream is = null;
  try
  {
   is = new FileInputStream(strCertificatePath);
   cer = factory.generateCertificate(is);
  }
  finally
  {
   StreamUtil.safeClose(is);
  }
  Signature sign = Signature.getInstance(signatureAlgorithmName);
  sign.initVerify(cer);
  return sign;
 }

 public static void main(String[] args)
 {
  try
  {
   Signature signer = createSigner(null,"MD5withRSA","E:\\Working\\FTL\\MSB-BANKGATEWAY\\Source\\Service\\src\\com\\ftl\\obg\\thread\\msb.store","keystorePass","keyAlias","keyAliasPass");
   Signature verifier = createVerifier("X.509","MD5withRSA","E:\\Working\\FTL\\MSB-BANKGATEWAY\\Source\\Service\\src\\com\\ftl\\obg\\thread\\msb.cer");
   System.out.println("Signed message: " + StringUtil.byteArrayToHexString(signMessage(signer,"XXXÁDSADRR")));
   System.out.println("Verify message: " + verifyMessage(verifier,"XXXÁDSADRR".getBytes(),signMessage(signer,"XXXÁDSADRR")));
  }
  catch(Exception ex)
  {
   ex.printStackTrace();
  }
 }
}


P/S : Quên mất, để generate key thì ta dùng keytool của java. Câu lệnh như sau:
keytool -genkeypair -keyalg RSA -sigalg MD5withRSA -dname "c=VN,
cn=TuanNX, o=FTL, st=Ha Noi, l=Ha Noi" -keystore keystore "","keyAliasPass -storepass -keypass keystorePass -alias keyAlias -validity 10950

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

Đăng nhận xét