JAVA 實現 基於RSA算法的簽名驗籤

基本步驟

簽名方:

1用sha1算出原文的摘要

2用私鑰對摘要進行加密

3對密文進行BASE64編碼


驗證方:

1對密文進行BASE64解碼

2用公鑰對解碼後的密文解密

3用sha1對原文計算摘要並和解密後的明文比對


上乾貨

//參數字符串
        String userId="2312sd";
        String orderId="232djfj";
        String price="12312";
        //用於簽名和傳輸的字符串
        StringBuffer bufferStr =new StringBuffer();
        bufferStr.append("userId=").append(userId)
        .append("&orderId=").append(orderId)
        .append("&price=").append(price);
        //隨機生成祕鑰對
        //指定算法爲RSA
        KeyPairGenerator  kpg =KeyPairGenerator.getInstance("RSA");
        //初始化
        kpg.initialize(1024);
        //獲取祕鑰對
        KeyPair keyPair =kpg.generateKeyPair();
        
        //數字簽名開始
        //第一步,對原文進行sha1
        String localStr =bufferStr.toString();
        MessageDigest md =MessageDigest.getInstance("SHA");
        byte[] shaDigest=md.digest(localStr.getBytes("utf-8"));
        //第二部,使用私鑰對原文進行加密
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        //ENCRYPT_MODE表示爲加密模式
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
        //加密
        byte[] rsaBytes = cipher.doFinal(shaDigest);
        //base64編碼
        byte[] base64Str = Base64.getEncoder().encode(rsaBytes);
        String base64enCode=new String(base64Str);
        //簽名加密完成數據傳輸到客戶端
        
        //客戶端驗證簽名開始
        //解碼base64
        //獲取原文
        String receiveStr=localStr;
        byte[] bese64Decoded =Base64.getDecoder().decode(base64enCode.getBytes());    
        //用公鑰進行解密
        Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher2.init(Cipher.DECRYPT_MODE, keyPair.getPublic());
        byte[] rsadecode= cipher2.doFinal(bese64Decoded);
        String sha1=Base64.getEncoder().encodeToString(rsadecode);
        String sha2=Base64.getEncoder().encodeToString(md.digest(receiveStr.getBytes("utf-8")));
        if(sha1.equals(sha2))
            System.out.println("驗籤成功");
        else
            System.out.println("驗籤失敗");

說明:  這裏只是簡單的實現了在本地的單向簽名,後面見陸續實現,雙向簽名,基於HTTPS的跨域簽名驗籤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章