1. 程式人生 > >http介面RSA加密例項

http介面RSA加密例項

http介面開發(json格式傳送請求)
一.http介面
1.httpclient注意以json格式傳送請求時entity為StringEntity
2.service端@ResponseBody:將請求處理後只返回響應體
3.service端以流的形式接受request請求
4.以下例項springmvc使用註解方式,mvc所需配置檔案:

<mvc:annotation-driven >
         <mvc:message-converters>
              <bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes"> <list> <value>text/plain;charset=utf-8</value> <value>
text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=utf-8</value> </list> </property> <property name="objectMapper"
>
<bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
5.接收json格式請求所需jackson Maven依賴:
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.1-1</version>
        </dependency>

httpclient完整程式碼:

    public static final String ALGORITHM = "RSA";
    public static final String SIGNATURE_ALGORITHM="MD5withRSA";
    private String publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDazJE8JgkL4hXA5pJwuBu9skcCrA6cQBGws3G0rmIp/K51sqGVCradW8ait03/5/sUKoHDF2tu89dcuhTYBxgidMDmyBlAznU8WRt9FrgCtlhq4evcq+ZeUAPyXtvBMU18gNJq0EctJbszjTBkGvHuEuJes5lPs3nT+eHG1edwfQIDAQAB";
    private String privatekey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANrMkTwmCQviFcDmknC4G72yRwKsDpxAEbCzcbSuYin8rnWyoZUKtp1bxqK3Tf/n+xQqgcMXa27z11y6FNgHGCJ0wObIGUDOdTxZG30WuAK2WGrh69yr5l5QA/Je28ExTXyA0mrQRy0luzONMGQa8e4S4l6zmU+zedP54cbV53B9AgMBAAECgYA/FCby3kxRXrbCzDZ/xLRKtjD+tjfoGBiBhtpLKtMmI7DwQbWP0GzhZOoZUxtroaejIrYSVpgkfqwiEYuc1D7Cd8N8ucXxG+UJE/lJoI9mlou5UAvEhJpjiWgKJDKkuRai3BfTBWDTCvDFrODPPeFaOGkIFgEFb+q2HoGOHjoOwQJBAPHlBHUz2M93Us2TKisTX+YrpZkyhEL6Z/U6EBcdVBhbnM9VFFT8g+qxQoFhsxg6xQe6I7vveRTR1cBDEqGzUkkCQQDnjsg1+RFdPRfJ4Z55KjdeP5Q2M3iLMGlPOSgcKKPXE7GI3A8rRY+STHXOgP+PWVESRGEG4LhyREwJHjGzRCyVAkEAq++kLoaOylC/W34KUBnyZVGK4IymtFD2ybjerP9cwf+EQ17vF8VxIsWiRwKh4UwMtoRZWAFMqD7KV2GVgbhLeQJAHEw1qWrjtVpG8vPwkuwW0hzA9xK5M4FaDUV14mMRCrKsaoZCEE6y6fUQHIllMdZ/ctUKanXB9KzmAeM/vaGiNQJAGk7xrqDAETApzZhwWmSxNzOJhVcOvo9URXwbwiuD/H5jsxCXMbIog5t0uiGhDN4Aqv5JeGODgGXbWcS598J8/A==";

    @Test
    public void Test() throws Exception {
        HttpPost post = new HttpPost("http://192.168.1.163/KeXieUMC/getPersonByMemberId.htm");
        //獲取securityKey
        PublicKey publicKey = getPublicKey(publickey);
        PrivateKey privateKey = getPrivateKey(privatekey);
        //拼裝查詢條件xxx=xxx&yyy=yyy&zzz=zzz
        String param = "userId=11";
        //簽名
         Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);        
         sig.initSign(privateKey);
         sig.update(param.getBytes());
         byte[] sign = sig.sign();
         String signature = Base64.encodeBase64String(sign);
        //加密
        byte[] encrypt = encrypt(param, publicKey);
        String encodeBase64String = Base64.encodeBase64String(encrypt);
        //拼裝json格式請求引數
        JSONObject json = new JSONObject();
        json.put("data", encodeBase64String);
        json.put("signature",signature);
        StringEntity entity = new StringEntity(json.toString(),"UTF-8");
        //設定content編碼及型別
        entity.setContentEncoding("UTF-8");
        entity.setContentType("application/json");
        post.setEntity(entity);
        //模擬http post請求傳送資訊
        HttpClient client = HttpClients.createDefault();
        HttpResponse response = client.execute(post);
        System.out.println(response.getStatusLine().getStatusCode());
        if(response.getStatusLine().getStatusCode() ==200){
            HttpEntity entity_r = response.getEntity();
            String personal = EntityUtils.toString(entity_r);
            System.out.println(personal);
        }
    }

service端完整程式碼

    @ResponseBody
    @RequestMapping("/getPersonByMemberId.htm")
    public JSONObject getPersonByMemberId(HttpServletRequest request) throws Exception{
        JSONObject result = new JSONObject();
        ServletInputStream inputStream = request.getInputStream();
        StringBuffer buffer = new StringBuffer();
        byte[] b = new byte[1024];
        int len = 0;
        while( (len = inputStream.read(b))!=-1){
            buffer.append(new String(b, 0, len));
        }
        JSONObject json = JSONObject.fromObject(buffer.toString());
        //獲取密文
        String data = json.get("data").toString();
        //獲取簽名
        String signature = json.get("signature").toString();

        byte[] base64 = Base64.decodeBase64(data);
        PrivateKey privateKey = Commons.getPrivateKey();
        //獲取明文
        String value = Commons.decrypt(base64, privateKey);
        //簽名驗證
        boolean verify = Commons.verify(value.getBytes(), Base64.decodeBase64(signature));
        if(!verify){
            result.put("status", "failure");
            result.put("message", "數字簽名驗證未通過,可能有被篡改的風險");
            return result;
        }

        //明文處理
        String[] arr = value.split("&");
        HashMap<String,String> map = new HashMap<String,String>();
        for(String entry : arr){
            map.put(entry.split("=")[0], entry.split("=")[1]);
        }
        ...

        return result;
    }
public static PublicKey getPublicKey(String key) throws Exception {
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(
                Base64.decodeBase64(key));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }

    public static PrivateKey getPrivateKey(String key)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        PKCS8EncodedKeySpec privatekeySpec = new PKCS8EncodedKeySpec(
                Base64.decodeBase64(key));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(privatekeySpec);
    }

    public static byte[] encrypt(String text, PublicKey key) {
        byte[] cipherText = null;
        try {
            final Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            cipherText = cipher.doFinal(text.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherText;
    }

commons


import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;

public class Commons {

    public static final String ALGORITHM = "RSA";
    public static final String SIGNATURE_ALGORITHM="MD5withRSA";
    private static final String publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDazJE8JgkL4hXA5pJwuBu9skcCrA6cQBGws3G0rmIp/K51sqGVCradW8ait03/5/sUKoHDF2tu89dcuhTYBxgidMDmyBlAznU8WRt9FrgCtlhq4evcq+ZeUAPyXtvBMU18gNJq0EctJbszjTBkGvHuEuJes5lPs3nT+eHG1edwfQIDAQAB";
    private static final String privatekey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANrMkTwmCQviFcDmknC4G72yRwKsDpxAEbCzcbSuYin8rnWyoZUKtp1bxqK3Tf/n+xQqgcMXa27z11y6FNgHGCJ0wObIGUDOdTxZG30WuAK2WGrh69yr5l5QA/Je28ExTXyA0mrQRy0luzONMGQa8e4S4l6zmU+zedP54cbV53B9AgMBAAECgYA/FCby3kxRXrbCzDZ/xLRKtjD+tjfoGBiBhtpLKtMmI7DwQbWP0GzhZOoZUxtroaejIrYSVpgkfqwiEYuc1D7Cd8N8ucXxG+UJE/lJoI9mlou5UAvEhJpjiWgKJDKkuRai3BfTBWDTCvDFrODPPeFaOGkIFgEFb+q2HoGOHjoOwQJBAPHlBHUz2M93Us2TKisTX+YrpZkyhEL6Z/U6EBcdVBhbnM9VFFT8g+qxQoFhsxg6xQe6I7vveRTR1cBDEqGzUkkCQQDnjsg1+RFdPRfJ4Z55KjdeP5Q2M3iLMGlPOSgcKKPXE7GI3A8rRY+STHXOgP+PWVESRGEG4LhyREwJHjGzRCyVAkEAq++kLoaOylC/W34KUBnyZVGK4IymtFD2ybjerP9cwf+EQ17vF8VxIsWiRwKh4UwMtoRZWAFMqD7KV2GVgbhLeQJAHEw1qWrjtVpG8vPwkuwW0hzA9xK5M4FaDUV14mMRCrKsaoZCEE6y6fUQHIllMdZ/ctUKanXB9KzmAeM/vaGiNQJAGk7xrqDAETApzZhwWmSxNzOJhVcOvo9URXwbwiuD/H5jsxCXMbIog5t0uiGhDN4Aqv5JeGODgGXbWcS598J8/A==";
    //加密
    public static String decrypt(byte[] text, PrivateKey key) {  
        byte[] dectyptedText = null;  
        try {  
          final Cipher cipher = Cipher.getInstance(ALGORITHM);  
          cipher.init(Cipher.DECRYPT_MODE, key);  
          dectyptedText = cipher.doFinal(text);  
        } catch (Exception ex) {  
          ex.printStackTrace();  
        }  
        return new String(dectyptedText);  
      }  
    //解密
    public static byte[] encrypt(String text, PublicKey key) {
        byte[] cipherText = null;
        try {
            // get an RSA cipher object and print the provider
            final Cipher cipher = Cipher.getInstance(ALGORITHM);
            // encrypt the plain text using the public key
            cipher.init(Cipher.ENCRYPT_MODE, key);
            cipherText = cipher.doFinal(text.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherText;
    }
    //base64ToPrivatekey
    public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException{
        PKCS8EncodedKeySpec privatekeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privatekey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(privatekeySpec);
    }
    //base64ToPublickey
    public static PublicKey getPublicKey() throws InvalidKeySpecException, NoSuchAlgorithmException{
        X509EncodedKeySpec publickeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publickey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(publickeySpec);
    }

    public static boolean verify(byte[] data, byte[] sign) throws Exception {
        PublicKey pubK = getPublicKey();
        Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
        sig.initVerify(pubK);
        sig.update(data);
        return sig.verify(sign);
    }
}

附 json處理日期格式 JSONConfig使用:


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class DateJsonValueProcesseor implements JsonValueProcessor {

    private SimpleDateFormat dateFormat;
    private String datePattern = "yyyy-MM-dd";  
    public DateJsonValueProcesseor(String format) {
        this.datePattern = format;
    }

    @Override
    public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        return process(value);
    }
    @Override
    public Object processObjectValue(String key, Object value,
            JsonConfig jsonConfig) {
        return process(value);
    }

    private Object process(Object value) {
        try {
            if (value instanceof Date) {
                SimpleDateFormat sdf = new SimpleDateFormat(datePattern,Locale.UK);
                return sdf.format((Date) value);
            }
            return value == null ? "" : value.toString();
        } catch (Exception e) {
            return "";
        }

    }
}

常見問題
1.base64加密:sun 包下的base64加密方法在未來版本可能會被廢棄,不建議使用,如需強行使用可在maven中新增plugin-in…baidu,推薦使用org.apache.commons.codec.binary.Base64,功能強大;
2.PrivateKey、PublicKey可使用Stream的形式儲存到本地(此時沒有經過bse64轉碼)。RSA生成PrivateKey、PublicKey方法如下:

    @Test
    public void Test() throws NoSuchAlgorithmException, IOException {
        final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
        keyGen.initialize(1024);
        final KeyPair key = keyGen.generateKeyPair();
        PrivateKey privateKey = key.getPrivate();
        PublicKey publicKey = key.getPublic();
    }

3.privatekey、publickey成對出現,使用時要注意。

相關推薦

http介面RSA加密例項

http介面開發(json格式傳送請求) 一.http介面 1.httpclient注意以json格式傳送請求時entity為StringEntity 2.service端@ResponseBody:將請求處理後只返回響應體 3.

RSA加密例項

package com.example.secret; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import java.io.IOException; im

使用scala基於AKKA HTTP開發REST介面的簡單例項

一般情況下會使用SpringMVC開發REST介面,但是公司主開發語言是scala,因此採用AKKA HTTP(spray已經不再維護)來開發REST介面,具體可參看官網文件:AKKA HTTP 本文依據官網開發REST介面,具體如下: 開發環境:IDEA,MAVEN,SCALA

java 使用jsencrypt的js的rsa庫實現rsa加密傳輸,防止http明文傳輸

JSEncrypt 是js實現的rsa加密庫 前端使用rsa公鑰加密登入資訊,傳輸加密結果給服務端,服務端接收後使用私鑰解密,實現安全資訊傳輸 【注】:JSEncrypt支援的是openssl生成的pkcs1格式私鑰,java需要pkcs8格式私鑰,公鑰格式不變 //公私鑰生

HTTP介面POST方式呼叫例項

客戶端請求HTTP介面(POST): 方法一: String url ="http://IP:埠/usi-sep/services/SqmScapService?wsdl";//請求介面地址 URL wsUrl = new URL(url); HttpURLConne

python實現aes加密解密,RSA簽名和驗籤,RSA加密解密,並呼叫介面

用python實現呼叫介面的示例程式碼,過程涉及到很多的加密演算法,值得分享一下。首先公鑰和私鑰如何生成,並且能相容java平臺,嘗試了很多方法。最終決定用openssl命令前提,需要安裝openssl,Crypto庫生成公鑰私鑰對過程:生成私鑰: openssl ge

php rsa加密解密例項(非對稱加密

php服務端與客戶端互動、提供開放api時,通常需要對敏感的部分api資料傳輸進行資料加密,這時候rsa非對稱加密就能派上用處了,下面通過一個例子來說明如何用php來實現資料的加密解密 1、加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以

介面測試 +RSA 加密

public static String sign(byte data, final String privateKey) throws Exception { byte keyBytes = Base64Utils.decrypt(privateKey);

我的Android進階之旅------>Android採用AES+RSA加密機制對http請求進行加密

本文轉載自部落格:http://blog.csdn.net/ouyang_peng/article/details/50983574 ----------------------------------------------------------------------

php rsa加密解密例項

php服務端與客戶端互動、提供開放api時,通常需要對敏感的部分api資料傳輸進行資料加密,這時候rsa非對稱加密就能派上用處了,下面通過一個例子來說明如何用php來實現資料的加密解密 1、加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以)

利用openssl進行RSA加密解密例項

轉載自:http://www.cnblogs.com/aLittleBitCool/archive/2011/09/22/2185418.html openssl是一個功能強大的工具包,它集成了眾多密碼演算法及實用工具。我們即可以利用它提供的命令臺工具生成金鑰、證書來加

robotframework 介面測試+RSA加密

java版的加密函式如下: public static String sign(byte[] data, final String privateKey) throws Exception { byte[] keyBytes = Base64Utils.decr

Python的RSA加密和PBE加密

nbsp 信息 bytes 任務 競爭 對手 nco bsp join 最近在寫接口的時候,遇到了需要使用RSA加密和PBE加密的情況,對方公司提供的DEMO都是JAVA的,我需要用python來實現。 在網上搜了一下,python的RSA加密這塊寫的還是比較多的,但是PB

RSA加密

計算機 美國 科學家 加密 如何 RSA背景在1976年以前,傳統的加解密過程是:1、A采用某種手段對數據進行加密。2、數據傳輸到B的手中。3、B逆向的實施A加密采用的步驟。4、數據被還原。這就是所謂的對稱加密。解密和加密的互為彼此的逆過程。加密的人必定知道解密的手段。解密的人也必定知道加

登錄頁面之RSA加密

ext number public 加密 公鑰加密 req 等於 賬號安全 fcc 我的項目是金融類項目,所以一般的form表單做登錄頁面未免太草率,所以決定使用加密技術RSA, RSA是目前使用最為廣泛的非對稱性加密算法,其設計思路為:將兩個大素數進行相乘,乘積作為公

利用RSACryptoServiceProvider進行RSA加密解密

rop color ria keyvalue ngs eat splay null crypto 利用RSACryptoServiceProvider進行RSA加密解密 加密獲取公私鑰 static void Main(string[] args)

RSA加密算法--Java實現詳細案例:

數據 turn 是否 exce x509 ase algorithm 實現 date import org.apache.commons.codec.binary.Base64; import java.security.*; import java.security.

JavaScript 版本的 RSA加密庫文件

nbsp javascrip big arr http pub int 地址 oct <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4

rsa加密算法,前後端實現。

exceptio eof 測試 ror iic shm rsa加密算法 pac puts 前端js:   下載地址:http://travistidwell.com/jsencrypt/ js第一版本: 1 // 對數據加密 2 function e

RSA加密算法

準備 nbsp 次方 進行 滿足 可用 十分 生成密鑰 隨機數生成器 1.什麽是RSA   RSA是一種公鑰加密算法,可用於公鑰加密和數字簽名 2.RSA加密 RSA加密過程可用下面的公式表達 密文=(明文^E) mod N RSA的密文等於明文代表數字的E次方除以N