基本步驟
簽名方:
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的跨域簽名驗籤。