base64android
1. Android Okhttp/Retrofit網路請求加解密實現方案
比較安全的方案應該是AES+RSA的加密方式。具體如下圖所示。
為什麼要這樣做呢?
1、RSA是非對稱加密,公鑰和私鑰分開,且公鑰可以公開,很適合網路數據傳輸場景。但RSA加密比較慢,據說比AES慢100倍,且對加密的數據長度也有限制。
2、AES是對稱加密,加密速度快,安全性高,但密鑰的保存是個問題,在網路數據傳輸的場景就很容易由於密鑰泄露造成安全隱患
3、所以,AES+RSA結合才更好,AES加密數據,且密鑰隨機生成,RSA用對方(伺服器)的公鑰加密隨機生成的AES密鑰。傳輸時要把密文,加密的AES密鑰和自己的公鑰傳給對方(伺服器)。對方(伺服器)接到數據後,用自己的私鑰解密AES密鑰,再拿AES密鑰解密數據得到明文。這樣就綜合了兩種加密體系的優點。
4、除上面說的外,還可以加簽名,即對傳輸的數據(加密前)先做個哈希,然後用自己的RSA私鑰對哈希簽名(對方拿到自己的公鑰可以驗簽),這樣可以驗證傳輸內容有沒有被修改過。
就java來說,加密的輸入和輸出都是位元組數組類型的,也就是二進制數據,網路傳輸或本地保存都需要重新編碼為字元串。推薦使用Base64。Android 有自帶的Base64實現,flag要選Base64.NO_WRAP,不然末尾會有換行影響服務端解碼。
Android中Base64加密
總而言之,這些不同語言都有實現庫,調用即可,關鍵是參數要一致,具體還需要和後台聯調一下。
rsa加解密的內容超長的問題解決
現在說到網路框架,應該毫無疑問是Retrofit了。上面說的加密方案說到底還是要在網路請求框架內加上,怎麼做入侵最小,怎麼做最方便才是重點。
1、坑定不能直接在介面調用層做加密,加參數,這樣每個介面都要修改,這是不可能的。
2、ConverterFactory處理,這也是網上可以搜到的很多文章的寫法,但我覺得還是有入侵。而且有點麻煩。
3、OkHttp添加攔截器,這種方法入侵最小(可以說沒有),實現呢也非常優雅。
下面的實現,網上也找不到多少可以參考的文章,但不得不說,OkHttp的封裝和設計真的很好用,所見即所得。看下源碼,就知道該怎麼用了,連文檔都不用查。
主要注意點:
0、和介面無關的新加的數據放在請求頭里。
1、該close的要close,不然會內存泄漏。
2、新舊Request和Response要區分好,新的要替換舊的去傳遞或返回。
3、要對response.code()做處理,只有在和後台約定好的返回碼下才走解密的邏輯,具體看自己的需求,不一定都是200。
2. android 程序 從資料庫獲取的base64類型的字元串轉換成圖片 再通過HashMap 傳進入 但是圖片顯示不了
可以把bitmap圖片和base64字元串來互相轉換~ 從此媽媽再也不用擔心我處理bitmap啦~
/**
* 將bitmap轉換成base64字元串
*
* @param bitmap
* @return base64 字元串
*/
public String bitmaptoString(Bitmap bitmap, int bitmapQuality) {
// 將Bitmap轉換成字元串
String string = null;
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, bitmapQuality, bStream);
byte[] bytes = bStream.toByteArray();
string = Base64.encodeToString(bytes, Base64.DEFAULT);
return string;
}
/**
* 將base64轉換成bitmap圖片
*
* @param string base64字元串
* @return bitmap
*/
public Bitmap stringtoBitmap(String string) {
// 將字元串轉換成Bitmap類型
Bitmap bitmap = null;
try {
byte[] bitmapArray;
bitmapArray = Base64.decode(string, Base64.DEFAULT);
bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0,
bitmapArray.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
3. Android ,base64轉bitmap
1 把圖像文件讀如byte數組中。
2 然後調用EncodeBase64函數,把Byte數組傳入,函數返回Base64的字元串。
以上即可完成Base64轉換。
反方向
1 然後調用DecodeBase64函數,把Byte64字元串傳入,函數返回Byte數組。
2 把Bye數組內容寫入文件,文件名為bitmap點陣圖的bpm文件即可。
4. java base64解密亂碼問題 代碼如下:
private String getPictureString() {
String upload = "";
try {
FileInputStream in = new FileInputStream(fileName);
byte[] ba = new byte[in.available()];
in.read(ba);
in.close();
upload = new String(android.util.Base64.encode(ba,
android.util.Base64.DEFAULT));
} catch (FileNotFoundException e) {
LogUtil.e(e.getMessage(), e);
} catch (IOException e) {
LogUtil.e(e.getMessage(), e);
}
return upload;
}
這個是加密
解密就是
encode換成decode
upload=newString(android.util.Base64.decode(ba,
android.util.Base64.DEFAULT));
5. 濡備綍鎶奲yte杞鎹㈡垚base64鐨刡yte
鐢變簬璇ラ棶棰樻病鏈夋爣鏄庢槸java鎴栬呮槸android鐨勶紝浠ヤ笅鎴戠殑瑙e喅鏂規硶:
android:
byte[]result=Base64.encode(key,Base64.DEFAULT);
鍏朵腑key 鐨勭被鍨嬫槸byte[].姝ゆ柟娉曟槸android鑷甯︾殑瑁呮崲鏂規硶銆
濡傛灉鎰熻 byte[] result 寰堜笉鐩磋傦紝鍙浠ヤ嬌鐢 new String錛坮esult錛 鏂規硶杞鍖栨垚 瀛楃︿覆綾誨瀷榪涜岃緭鍑恆
java璇璦錛堜笉澶氳磋存槑浜嗭紝搴曚笅浠g爜鍐欑殑寰堣︾粏錛夛細
//瀹氫箟涓涓狟ASE64Encoder
BASE64Encoderencode=newBASE64Encoder();
//灝哹yte[]杞鎹涓篵ase64
Stringbase64=encode.encode("浜旂瑪瀛楀瀷鐢靛瓙璁$畻鏈".getBytes());
//杈撳嚭base64
System.out.println(base64);
//鏂板緩涓涓狟ASE64Decoder
BASE64Decoderdecode=newBASE64Decoder();
//灝哹ase64杞鎹涓篵yte[]
byte[]b=decode.decodeBuffer(base64);
//杈撳嚭杞鎹㈠悗鐨刡yte[]
System.out.println(newString(b));}
6. 安卓開發中怎麼將文件轉換成base64字元串
將文件轉成base64 字元串,android 手機開發的時候會用到,當然在android有轉base64的方法,這里調用的是jdk的api
[代碼] [Java]代碼
01 package com.xbl.test;
02
03 import java.io.File;
04 import java.io.FileInputStream;
05 import java.io.FileOutputStream;
06
07 import sun.misc.BASE64Decoder;
08 import sun.misc.BASE64Encoder;
09
10 public class File2Code {
11
12 /**
13 * <p>將文件轉成base64 字元串</p>
14 * @param path 文件路徑
15 * @return
16 * @throws Exception
17 */
18 public static String encodeBase64File(String path) throwsException {
19 File file = new File(path);
20 FileInputStream inputFile = new FileInputStream(file);
21 byte[] buffer = new byte[(int)file.length()];
22 inputFile.read(buffer);
23 inputFile.close();
24 return new BASE64Encoder().encode(buffer);
25 }
26 /**
27 * <p>將base64字元解碼保存文件</p>
28 * @param base64Code
29 * @param targetPath
30 * @throws Exception
31 */
32 public static void decoderBase64File(String base64Code,String targetPath) throws Exception {
33 byte[] buffer = new BASE64Decoder().decodeBuffer(base64Code);
34 FileOutputStream out = new FileOutputStream(targetPath);
35 out.write(buffer);
36 out.close();
37 }
38 /**
39 * <p>將base64字元保存文本文件</p>
40 * @param base64Code
41 * @param targetPath
42 * @throws Exception
43 */
44 public static void toFile(String base64Code,String targetPath)throws Exception {
45 byte[] buffer = base64Code.getBytes();
46 FileOutputStream out = new FileOutputStream(targetPath);
47 out.write(buffer);
48 out.close();
49 }
50 public static void main(String[] args) {
51 try {
52 String base64Code =encodeBase64File("D:\\1.jpg");
53 System.out.println(base64Code);
54 decoderBase64File(base64Code, "D:\\2.jpg");
55 toFile(base64Code, "D:\\three.txt");
56 } catch (Exception e) {
57 e.printStackTrace();
58 }
59 }
60
61 }
7. android webService開發過程中 介面上需要的Base64Binary參數 我應該用什麼類型的參數去對應求答案
1、參考http://pointonline.iteye.com/blog/736356
byte[] d ; // d中存放需要傳遞的數據
String data = new String(Base64.encode(d));
SoapObject request= new SoapObject(nameSpace, function);
request.addProperty(str,new SoapPrimitive(SoapEnvelope.ENC,"base64Binary",data));
2、我自己開發的項目中,直接傳遞的,也成功了
ByteArrayOutputStream baos; // baos中存放需要傳遞的數據
// 進行Base64編碼
String uploadBuffer = new String(Base64.encode(baos.toByteArray()));
SoapObject request= new SoapObject(nameSpace, function);
request.addProperty(str,uploadBuffer );