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