1. 程式人生 > >Android客戶端和伺服器交換資料的一種方案

Android客戶端和伺服器交換資料的一種方案

由於很多因素使得客戶端和伺服器之間互動的一些資料都要經過加密,為了方便,很多使用非對稱的加密演算法進行加密,其中RSA演算法成為首選。下面說說在Android客戶端怎中怎麼應用這種加密方案。

首先在我們Android客戶端啟動應用程式的時候,我們先請求一個伺服器,讓服務將RSA的公鑰返回給我們,然後我們將取得的公鑰對我們的資料進行加密,然後再返回給伺服器,伺服器將用私鑰解密即可。

一般為了方便,伺服器傳遞公鑰的時候,不直接將公鑰傳遞過來,我們都知道RSA演算法是通過對大素數的一些操作而得來的,這時候我們主要得到兩個數就可以重新生成一個公鑰了。要生成一個公鑰,必須要知道modulus和exponent,所以伺服器一開始只要返回這兩個資料就OK。

下面方法是通過modulus和exponent生成公鑰的:

	/**
	 * 描述:根據所提供的公鑰係數和公鑰指數,重新構建RSA公鑰
	 * 
	 * @param modulus
	 *            公鑰係數
	 * @param publicExponent
	 *            公鑰指數
	 * @return RSAPublicKey
	 * */
	private RSAPublicKey rebuildRSAPublicKey(String modulus, String publicExponent) {
		RSAPublicKey rpk = null;
		KeyFactory kf = null;
		try {
			kf = KeyFactory.getInstance("RSA");
			rpk = (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(new BigInteger(modulus, 16), new BigInteger(
					publicExponent, 16)));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
		return rpk;
	}

有了公鑰,那就好辦了,我們由公鑰初始化一個加密工具了。

當然,伺服器也可以直接將公鑰傳遞過來,然後客戶端再重新生成公鑰,做法如下:

現將公鑰轉碼(這裡設定伺服器語言為java):

byte[] keys = publicKey.getEncoded();
String string = bytesToHexString(keys);

其中bytesToHexString()這個方法是將byte[]轉換成十六進位制的字串,方便將其放在json裡面然後傳遞給客戶端
其實現如下:
public String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

客戶端通過解析json欄位,獲取其內容,然後進行下面操作,重新還原成公鑰:其中hexStringToBytes()方法是將字串轉換成byte[]陣列,記得與上面的要對應,實現如下:

	private PublicKey buildPublicKey(String keyString) throws Exception {
		byte[] keys = hexStringToBytes(keyString);
		KeySpec keySpec = new X509EncodedKeySpec(keys);
		KeyFactory factory = KeyFactory.getInstance("RSA");
		return factory.generatePublic(keySpec);
	}
	public byte[] hexStringToBytes(String hexString) {
		if (hexString == null || hexString.equals("")) {
			return null;
		}
		hexString = hexString.toUpperCase();
		int length = hexString.length() / 2;
		char[] hexChars = hexString.toCharArray();
		byte[] d = new byte[length];
		for (int i = 0; i < length; i++) {
			int pos = i * 2;
			d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
		}
		return d;
	}
	/**
	 * Convert char to byte
	 * 
	 * @param c
	 *            char
	 * @return byte
	 */
	private byte charToByte(char c) {
		return (byte) "0123456789ABCDEF".indexOf(c);
	}

相關推薦

Android客戶伺服器交換資料方案

由於很多因素使得客戶端和伺服器之間互動的一些資料都要經過加密,為了方便,很多使用非對稱的加密演算法進行加密,其中RSA演算法成為首選。下面說說在Android客戶端怎中怎麼應用這種加密方案。 首先在我們Android客戶端啟動應用程式的時候,我們先請求一個伺服器,讓服務將R

Android客戶伺服器資料互動的第四方法

        網上有很多例子來演示Android客戶端和伺服器端資料如何實現互動不過這些例子大多比較繁雜,對於初學者來說這是不利的,現在介紹幾種程式碼簡單、邏輯清晰的互動例子,本篇部落格介紹第四種:         一、伺服器端:         程式碼1:新增名為“A

Socket 通訊原理(Android客戶伺服器以TCP&&UDP方式互通)

ZERO、前言 有關通訊原理內容是在網上或百科整理得到,程式碼部分為本人所寫,如果不當,還望指教。 一、Socket通訊簡介  Android與伺服器的通訊方式主要有兩種,一是Http通訊,一是Socket通訊。兩者的最大差異在於,http連線使用的是“請求—響應方式

Android 客戶伺服器進行資料互動(、登入伺服器

概要 安卓APP要實現很多功能(比如登入註冊、發表評論等)時都必須要使用到網路資料互動。所以在學習了這部分內容後,就將其以最常見的登入過程為例整理出來,也方便跟我一樣的新手能迅速學習上手。 預期效果圖如下,輸入手機號和密碼,點選Login按鈕,上傳資料到伺

Android客戶伺服器之間傳輸資料加密

       Android客戶端與伺服器進行資料傳輸時,一般會涉及到兩類資料的加密情況,一類是隻有建立者才能知道的資料,比如密碼;另一類是其他比較重要的,但是可以逆向解密的資料。        第一類:密碼類的資料,為了讓使用者放心註冊,密碼類的資料的加密一般都是經過

android客戶伺服器獲取json資料並解析的實現程式碼

package com.nuoter.adapterUntil;    import java.util.HashMap;  import java.util.List;    import android.content.Context;  import android.graphics.Bitmap;

使用TCP協議實現客戶伺服器資料傳輸

/*客戶端和服務端互訪,傳輸位元組流*/ import java.net.*; import java.io.*; class TCPClient2 { public static void main(String[] args) throws Exception

Android客戶伺服器的json資料互動(很詳細)

      Android客戶端與伺服器端的json資料互動,主要是通過json形式的資料互動,就是json的寫入和解析。  先看效果圖,我最討厭講東西,一個圖沒有的。 算了,看來我不是寫部落格的材料,寫不下去了,要排版之類的麻煩,大家還是直接去下載原始碼,裡面有大量的注

Android 客戶伺服器進行資料互動(二、登入客戶

概要 Android客戶端分為User,HttpUtil,HttpCallbackListener,MainActivity四個部分。User model與服務端的一樣,一方面是用於本地使用者資訊的儲存model,另一方面也是為了保證構造URL時使用的key一

android上傳大檔案到伺服器客戶伺服器程式碼

使用一般的上傳方法一般上傳不能超過2m的檔案,也非常容易中斷和出錯,於是本人打算使用xutils框架進行檔案上傳開發,話不多說直接上原始碼 首先要下載這個類庫的jar包,地址:https://github.com/wyouflf/xUtils android端程式碼: 新增

Android客戶伺服器資料通訊中文亂碼問題

         做了一個小的專案用到了客戶端與伺服器端通訊,然而隨之而來的問題就有了。 那就是中文亂碼問題,由伺服器端向客戶端或者客戶端向伺服器端傳送資料時,中文變為問號---?????---。  

android客戶伺服器獲取json資料並解析

今天總結一下: 首先客戶端從伺服器端獲取json資料 1、利用HttpUrlConnection 1 /** 2 * 從指定的URL中獲取陣列 3 * @param urlPath 4 * @return 5 *

socket用執行緒實現客戶伺服器連續傳送資料

總共涉及到四個類。 其中包括,一個客戶端client,一個服務端server, 然後伺服器端和客戶端都有傳送和接收的功能,所以還有一個傳送類sendThread實現runnable介面,還有個接收類receiveThread實現runnable介面。 在客戶端client和

Android客戶Java伺服器整合支付寶

一、申請移動支付許可權 首先登入【支付寶開放平臺】http://open.alipay.com/platform/home.htm,新增應用,申請移動支付許可權。申請開通支付,是需要公司檔案的,個人是不允許開始支付的。 具體細節就不再詳聊了,下面就講講如何將阿里給出的demo執行起來。 二、阿里支付D

用 socket 通訊寫出客戶伺服器的通訊 , 要求客戶傳送資料後能夠回顯相同的資料

比較基礎的一個服務端客戶端互相通訊的程式/** * @author john socket 的伺服器端,接收到資料後列印到控制檯 的資料 * */ public class ServiceSocket_1 { public static void main(

網路程式設計(InetAddress類、SocketServerSocket、實現客戶伺服器之間的雙向通訊)

網路程式設計的底層是IO,通過IO將一臺計算機中的資料傳送到另一臺計算機中。傳送的時候,要知道接受方的地址,該地址即為IP地址。知道IP地址後即可進行傳送。A向B發訊息,訊息是發過去了,但是B要怎樣接受呢?因此定義了埠,B監聽了A所使用的埠。A發的訊息中含有埠號,當B接受到訊息時,知道了埠號

通過python實現TCP在客戶伺服器上的單(多)執行緒的程式設計

1、只支援一個客戶端訪問 伺服器: from socket import * address='127.0.0.1' #監聽哪些網路 127.0.0.1是監聽本機 0.0.0.0是監聽整個網路 port=12345 #監聽自己的哪個埠 buffsize=

socket通訊:客戶伺服器的簡單實現

什麼是socket? socket最開始的含義是一個地址和埠對(ip, port)。Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求。 socket地址API:它唯一的表示了使用tcp通訊的一端,也可以將其理解成socket地址。 socket

[原始碼和文件分享]基於Android Studio實現的論壇網站Android客戶JAVA EE後臺

第一章 概述 1.1 開發環境 本安卓程式在Windows 10系統下使用Android Studio開發,後臺使用MyEclipse開發,測試環境為安卓系統5.1、4.4、4.3、5.0,螢幕尺寸5.0、5.1、5.5的安卓手機。 1.2 安裝配置 本安卓程式要求安卓SDK為API

Oracle客戶伺服器的字符集

--客戶端(當前環境) SELECT * FROM V$NLS_PARAMETERS;--NLS_LANGUAGE::SIMPLIFIED CHINESE --客戶端(當前會話) SELECT USERENV('language') FROM DUAL;--SIMPLIF