客户端在和平台端进行数据的通讯时,有时需要对传输的数据进行加密,下面介绍一些在开发中常用的加解密方法。

一、对称加密

1、对称加密(又称为私人秘钥加密/共享秘钥加密):加密与解密使用同一秘钥,也称为单密钥加密。
2、加密强度不高,但效率高,加密解密的速度比较快,适合数据比较长时的使用。
3、密钥分发困难,密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦
4、常见对称密钥加密算法
(1)、DES:替换+移位、56位密钥、64位数据块、速度快、密钥易产生
(2)、3DES(三重DES):两个56位的密钥K1、K2
加密:K1加密、 K2解密 、K1加密
解密:K1解密、 K2加密、 K1解密

二、非对称加密

1、 非对称加密(又称为公开密钥加密):密钥必须成对使用(公钥加密,相应的私钥解密)。发送方使用接收方的公钥进行加密,接收方接收到密文后用自己的私钥进行解密。
2、 加密速度慢,但强度高。
3、常见非对称密钥加密算法 RSA:512位(或1024位)密钥、计算量极大、难破解

三、对称加密的一般实现方案

1、在传输数据时,发送方先进行key和相关属性的MD5计算,接收方接到参数后也进行key和相关属性的MD5计算,在与传来的MD5值比对一致性。
2、相关代码实现

 // 64位public final static String KEY = "1234567895d8820c2ad87266599876543219aa667d777e5e7a217a1123456789";public void faceLogin(FaceLoginParam faceLoginParam, Observer observer) {if (!checkNetWork(observer)) {return;}SettingsInfo info = DataManager.getInstance().getSettingsInfo();String url = "http://" + info.libServerAddr + "/n/tp/face_scanning_result";String objString = faceLoginParam.equipmentId+ faceLoginParam.personId+ faceLoginParam.personName+ faceLoginParam.personPart+ faceLoginParam.timestamp+ Const.KEY;String md5String = MD5Util.getMD5(objString);faceLoginParam.secStr = md5String;FaceScanResultClient client = ServiceGenerator.createService(FaceScanResultClient.class);Observable<HttpResult> observable = client.faceScanResult4Rx(url, faceLoginParam);observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);}public class MD5Util {//生成MD5public static String getMD5(String message) {String md5 = "";try {MessageDigest md = MessageDigest.getInstance("MD5");  // 创建一个md5算法对象byte[] messageByte = message.getBytes("UTF-8");byte[] md5Byte = md.digest(messageByte);              // 获得MD5字节数组,16*8=128位md5 = bytesToHex(md5Byte);                            // 转换为16进制字符串} catch (Exception e) {e.printStackTrace();}return md5;}// 二进制转十六进制private static String bytesToHex(byte[] bytes) {StringBuffer hexStr = new StringBuffer();int num;for (int i = 0; i < bytes.length; i++) {num = bytes[i];if(num < 0) {num += 256;}if(num < 16){hexStr.append("0");}hexStr.append(Integer.toHexString(num));}return hexStr.toString();}}

四、非对称算法的实现


import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class RSATest {//非对称密钥算法public static final String KEY_ALGORITHM = "RSA";/*** 密钥长度必须是64的倍数*/private static final int KEY_SIZE = 512;/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception {// 1、初始化密钥,生成密钥对//实例化密钥生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGenerator.initialize(KEY_SIZE);//生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();//甲方公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//甲方私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();System.out.println("公钥:\r\n" + Base64.getEncoder().encodeToString(publicKey.getEncoded()));System.out.println("私钥:\r\n" + Base64.getEncoder().encodeToString(privateKey.getEncoded()));System.out.println("\r\n密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输");String str = "这里是甲方向乙方发送数据的原文,RSA密码交换算法";System.out.println("\r\n甲方向乙方发送加密数据:");System.out.println("原文:" + str);// 2、甲方向乙方发送数据时,用自己的私钥进行数据的加密byte[] code1 = RSATest.encryptByPrivateKey(str.getBytes(), privateKey.getEncoded());System.out.println("加密后的数据:" + Base64.getEncoder().encodeToString(code1));//3、 乙方收到数据后,用甲方的公钥进行数据的解密System.out.println("\r\n乙方使用甲方提供的公钥对数据进行解密:");byte[] decode1 = RSATest.decryptByPublicKey(code1, publicKey.getEncoded());System.out.println("乙方解密后的数据:" + new String(decode1) + "\r\n");System.out.println("===========反向进行操作,乙方向甲方发送数据==============\r\n");str = "这里是乙方向甲方发送数据原文,RSA算法";System.out.println("原文:" + str);//4、乙方使用甲方的公钥对数据进行加密System.out.println("\r\n乙方使用公钥对数据进行加密:");byte[] code2 = RSATest.encryptByPublicKey(str.getBytes(), publicKey.getEncoded());System.out.println("加密后的数据:" + Base64.getEncoder().encodeToString(code2));System.out.println("\r\n==========乙方将数据传送给甲方,甲方使用私钥对数据进行解密===========");//甲方使用自己的私钥对数据进行解密byte[] decode2 = RSATest.decryptByPrivateKey(code2, privateKey.getEncoded());System.out.println("甲方解密后的数据:" + new String(decode2));}/*** 私钥加密** @param data   待加密数据* @param key        密钥* @return byte[] 加密数据*/public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {//取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 私钥解密** @param data 待解密数据* @param key  密钥* @return byte[] 解密数据*/public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {//取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥加密** @param data  待加密数据* @param key       密钥* @return byte[] 加密数据*/public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {//实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥//密钥材料转换X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);//产生公钥PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);//数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(data);}/*** 公钥解密** @param data 待解密数据* @param key  密钥* @return byte[] 解密数据*/public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {//实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//初始化公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);//产生公钥PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);//数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, pubKey);return cipher.doFinal(data);}
}

Android数据加密传输相关推荐

  1. Android 和 PHP 之间进行数据加密传输

    Android 和 PHP 之间进行数据加密传输 [代码] [Java]代码 1 mcrypt = new MCrypt(); 2 /* Encrypt */ 3 String encrypted = ...

  2. android网络传输数据加密,Android网络数据加密传输

    在移动应用开发中, 对于数据安全传输要求非常高, 尤其是涉及到用户财产安全的时候,都会对数据进行层层加密来确保数据的安全性 完整性; `在这里演示:我将演示银行在移动应用上的数据加密; 传输的数据格式 ...

  3. android手机传输,智能手机怎么传文件 安卓手机怎么传文件 安卓手机文件传输方法集合...

    智能手机的功能多了,也会造成一个麻烦,就是需要越来越多种类的文件,文件容量越来越大,跟电脑或者其他手机倒起来也会相对麻烦,就拿苹果手机来说,如果要用手机和电脑相互间传一些东西的话,就需要电脑端有iTu ...

  4. android 文件传输_使用“发送到”轻松将文件传输到您的Android设备

    android 文件传输 The "Send to" menu has been around since Windows 95; so long a lot of users m ...

  5. 安全扫描:敏感数据加密传输和保存(国密)

    记难受的老项目进行安全扫描的坑:敏感数据加密传输和保存 首先我们先创建这么一个JAVA工具类,用里面的main方法来得到SM2加密时需要用到的公钥和私钥,需要注意的是,执行一次就拿到这两个值来放到另一 ...

  6. android实时传输视频Socket

    android实时传输视频Socket https://download.csdn.net/download/u012560682/7780979?spm=1001.2101.3001.5697 An ...

  7. Android高效的数据加密方案,Android数据加密方案

    很多人都知道Android数据需要加密,毕竟反编译.抓包,你懂的,可是有时候不知道从何入手,比如菜鸟的我,经过这几天的折腾之后,我整理了一些思路,有不对的地方,还请多多指点. 2.加固:APP上线之前 ...

  8. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  9. Android数据加密解密

    最近项目在维护过程中,估计这一周都会没有什么事情做了.于是开始打量自己做完的这个项目,项目在展示方面乏善可陈,然后仔细的想了想,这个项目的亮点无非就在数据加密和解密这一块了.因为是银行的项目,所以对数 ...

最新文章

  1. 微服务架构,多“微”才合适?
  2. multi agent system university of liverpool professional presentation
  3. 四参数坐标转换c++_GPSRTK坐标转换及四参数、七参数适用条件
  4. 监听滚动条和浏览器大小变化
  5. 函数----MoveWindow
  6. java安卓6.0闪退_Android开发activity跳转闪退
  7. C#中out和ref之间的区别
  8. impress.js学习总结
  9. 文件系统 和 网络附接存储(NAS: Network Attached Storage)
  10. ISO27001认证办理流程及2022年补贴政策汇总
  11. Linux实验四——Linux用户和用户组管理
  12. 为你写诗(LSTM 诗歌生成器)
  13. matlab与信道编码,基于MATLAB的信道编码.doc
  14. JAVA跑步计时器app_锻炼计时器app
  15. Win11如何显示/隐藏语言栏?
  16. 单例模式java概括_单例模式中总有几个歪门邪道的问题要知道!
  17. javax.mail实现收发邮件
  18. 【每日一句】名人名言学英语(11.26)
  19. 聊聊外包团队的高效管理机制
  20. Linux之集群部署(超简单!)

热门文章

  1. 鸿蒙系统车联网,华为鸿蒙上车,关于车联网的想象有多少?
  2. 软考高级软件架构风格定义以及分类
  3. Win10:快捷键整理,嗖嗖地办公
  4. Oracle客户端安装INS-30131
  5. ISO 4589-2 OI极限氧指数与UL94V0阻燃等级
  6. Mac 终端命令汇总
  7. ios label文字行间距_UILabel UITextField调整行间距【原创】
  8. windows远程桌面连接任务栏显示问题
  9. 医疗数据交易平台-区块链解决方案
  10. javascript 异步编程二(转载 from 司徒正美)