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 );