数据传输过程加密方案

news/2025/2/21 4:30:23/

文章目录

  • 前言
    • 数据加密方案
    • 数据加密细节
      • AES加解密
    • RSA公钥加密
    • 总结

前言

从前一篇网络安全基础要点知识介绍中可以知道,在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改,就可能导致用户受到伤害,比如被诈骗,所以对客户端与服务端的传输数据加密,是网络通信中必不可少的。

数据加密方案

首先,客户端与服务端商量好数据加密协议,对传输数据做到安全保护。

安全保护至少需要有下面两点:

采用HTTPS协议
采用公钥密码体制RSA算法对数据加密
现在安全是保证了,但还要考虑到性能问题,由于RSA算法对数据加密时运算速度慢,所以直接把所有传输数据都用RSA加密,会导致网络通信慢,这对用户将是不好的体验。由于对称密钥密码体制中的AES运算速度快且安全性高,所以结合AES对传输数据加密是非常好的方案。

下面是对客户端与服务端通信数据加密比较通用的方案:

客户端生成AES密钥,并保存AES密钥
客户端用AES密钥对请求传输数据进行加密
客户端使用RSA公钥对AES密钥加密,然后把值放到自定义的一个请求头中
客户端向服务端发起请求
服务端拿到自定义的请求头值,然后使用RSA私钥解密,拿到AES密钥
服务端使用AES密钥对请求数据解密
服务端对响应数据使用AES密钥加密
服务端向客户端发出响应
客户端拿到服务端加密数据,并使用之前保存的AES密钥解密
注意:传输数据使用AES密钥加密,RSA公钥对AES密钥加密。RSA公钥和私钥由服务端生成,公钥放在客户端,私钥放在服务端。公钥私钥要私密保护,不能随便给人。

具体流程图如下:
在这里插入图片描述
上面网络通信过程是安全的,可以保证通信数据即使被截取了,也无法获得任何有效信息;即使被篡改了,也无法被客户端和服务端验证通过。

数据加密细节

AES加解密

生成AES密钥和使用AES密钥加密、解密,有下面重要的几点:

1.密钥长度的选择:AES能支持的密钥长度可以为128,192,256位(也即16,24,32个字节),这里选择128位。

2.算法/模式/填充的选择:

算法/模式/填充字节加密后数据长度不满16字节加密后长度
AES/CBC/NoPadding16不支持
AES/CBC/PKCS5Padding3216
AES/CBC/ISO10126Paddind3216
AES/CFB/NoPadding16原始数据长度
AES/CFB/PKCS5Padding3216
AES/CFB/ISO10126Padding3216
AES/ECB/NoPadding16不支持
AES/ECB/PKCS5Padding3216
AES/ECB/ISO10126Padding3216
AES/OFB/NoPadding16原始数据长度
AES/OFB/PKCS5Padding3216
AES/OFB/ISO10126Padding3216
AES/PCBC/NoPadding16不支持
AES/PCBC/PKCS5Padding3216
AES/PCBC/ISO10126Padding3216

这里选择AES/CBC/PKCS5Padding。

3.添加向量 IvParameterSpec:增强算法强度。
4.编码格式选择:UTF-8。

下面为具体代码实现:

    private final int AES_KEY_LENGTH = 16;//密钥长度16字节,128位private final String AES_ALGORITHM = "AES";//算法名字private final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";//算法/模式/填充private final String AES_IV = "0112030445060709";//使用CBC模式,需要一个向量iv,可增加加密算法的强度private final String AES_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLOP";private final Charset UTF_8 = Charset.forName("UTF-8");//编码格式/*** 使用AES加密** @param aesKey AES Key* @param data   被加密的数据* @return AES加密后的数据*/private byte[] encodeAES(byte[] aesKey, String data) {if (aesKey == null || aesKey.length != AES_KEY_LENGTH) {return null;}SecretKeySpec keySpec = new SecretKeySpec(aesKey, AES_ALGORITHM);try {Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);IvParameterSpec iv = new IvParameterSpec(AES_IV.getBytes(UTF_8));cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);return cipher.doFinal(data.getBytes(UTF_8));} catch (Exception e) {Log.d(TAG, e.getMessage(), e);}return null;}/*** 使用AES解密** @param aesKey AES Key* @param data   被解密的数据* @return AES解密后的数据*/private String decodeAES(byte[] aesKey, byte[] data) {if (aesKey == null || aesKey.length != AES_KEY_LENGTH) {return null;}SecretKeySpec keySpec = new SecretKeySpec(aesKey, AES_ALGORITHM);try {Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);IvParameterSpec iv = new IvParameterSpec(AES_IV.getBytes(UTF_8));cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);return new String(cipher.doFinal(data), UTF_8);} catch (Exception e) {Log.d(TAG, e.getMessage(), e);}return null;}private int getRandom(int count) {return (int) Math.round(Math.random() * (count));}/*** 生成AES key** @return AES key*/private String initAESKey() {StringBuilder sb = new StringBuilder();int len = AES_STRING.length();for (int i = 0; i < AES_KEY_LENGTH; i++) {sb.append(AES_STRING.charAt(getRandom(len - 1)));}return sb.toString();}

现在AES密钥和AES加密、解密都有了,在通常情况下,还会对加密、解密过程进行Base64 编码、解码。

Base64编码,选择 URL_SAFE 标识,也就是 “-” 和 “_” 会被替换为 “+” 和 “/”,:

    /*** 对数据进行Base64编码,使用的是{@link android.util.Base64},而且flags需要使用 {@link android.util.Base64#URL_SAFE,android.util#Base64.NO_PADDING,android.util.Base64#NO_WRAP}。** @param input 来源数据* @return Base64编码的数据*/private String encodeBase64(byte[] input) {return new String(Base64.encode(input, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP), UTF_8);}

Base64解码,和编码对应:

    /*** 对数据进行Base64解码,使用的是{@link android.util.Base64},而且flags需要使用 {@link android.util.Base64#URL_SAFE,android.util.Base64#NO_WRAP},主要是为了和Base64加密对应。** @param str 需要解码的数据* @return Base64解码后的数据*/private byte[] decodeBase64(String str) {return Base64.decode(str.getBytes(UTF_8), Base64.URL_SAFE | Base64.DEFAULT);}

RSA公钥加密

RSA公钥是从服务端拿到的,这个公钥不能被泄漏,必须做到安全保护。

使用RSA公钥加密,也有几个重要点:

1.拿到的公钥是Base64 编码后的,所以首先需要对公钥Base64解码。

2.算法/模式/填充的选择:RSA/ECB/PKCS1Padding

3.编码格式选择:UTF-8。

注意:使用RSA公钥加密的流程对应的就是服务端使用RSA私钥解密的流程,所以需要和服务端沟通商量好。

具体代码实现:

    private final String RSA_PUB_KEY = "服务端给的公钥";private final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding";/*** 公钥加密** @param data           要加密的数据* @param key            公钥* @param transformation 算法/模式/填充* @return 加密后的数据*/public byte[] encryptByPublicKey(byte[] data, String key, String transformation)throws GeneralSecurityException {byte[] keyBytes = Base64.decode(key.getBytes(UTF_8), Base64.NO_WRAP);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey pubKey = keyFactory.generatePublic(keySpec);Cipher cipher = Cipher.getInstance(transformation);cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(data);}

总结

1.为了保证网络通信中的通信数据安全,首先采用HTTPS协议和公钥密钥体制中的RSA加密。

2.因为是RSA运算速度慢,所以采用运算速度快且安全性高的对称密钥密码体制中的AES对所
有传输数据进行加密,然后再用RSA对AES密钥加密,这样既能保证安全又能保证性能。

3.RSA公钥和私钥由服务端生成,公钥放在客户端,私钥放在服务端。

4.数据加密后采用Base64编码,数据解密前采用Base64解码。

5.编码格式同一采用UTF-8。


http://www.ppmy.cn/news/466557.html

相关文章

数据加密标准(DES)概念及工作原理

0x01 数据加密标准DES介绍 数据加密标准&#xff08;Data Encryption Standard&#xff09;&#xff08;DES&#xff09;是一种用于加密数字数据的对称密钥算法。密钥长度为56位&#xff0c;安全性不强&#xff0c;但它在密码学的进步中具有很大的影响力。 0x02 数据加密标准历…

数据库数据加密及其他安全性保护

数据加密 数据加密 防止数据库中数据在存储和传输中失密的有效手段 加密的基本思想 根据一定的算法将原始数据—明文&#xff08;Plain text&#xff09;变换为不可直接识别的格式—密文&#xff08;Cipher text&#xff09; 加密方法 存储加密 传输加密 存储加密 透明…

PostgreSQL 数据加密之 pgcrypto

文章目录 pgcrypto 简介pgcrypto 安装单向加密通用哈希函数密码哈希函数 双向加密PGP 加密函数PGP 函数选项原始加密函数 随机数据函数其他事项pgcrypto 配置NULL 处理安全限制 大家好&#xff0c;我是只谈技术不剪发的 Tony 老师。 根据信息安全的相关要求&#xff0c;用户的…

漫谈数据保护和个人信息加密

相信诸位同学最近收到了不少大厂的Privacy Update类似的消息吧&#xff0c;没错&#xff0c;前两天&#xff0c;也就是25日&#xff0c;欧盟的《一般数据保护条例》(GDPR)正式生效。大厂们纷纷赶在生效日到来之前&#xff0c;匆匆更新了自己Privacy条例。很明显&#xff0c;GDP…

接口数据传输加密

数据加密 场景&#xff1a;我们客户端请求服务端时数据正常都是明文传输&#xff0c;这样的话容易出现数据安全漏洞 例子&#xff1a;登录注册时传输的密码&#xff0c;还是用户个人敏感信息&#xff0c;都是明文传输的话就太不安全了 解决&#xff1a;所以我们在客户端传输…

EXCEL表格-整体加密和内容加密

❤关注我&#xff0c;不迷路❤ 点击进入EXCEL综合应用场景专栏 对于保密性高的文件通常都需要加密&#xff0c;对于EXCEL而言&#xff0c;加密的方式有很多&#xff0c;本文主要列举三种加密方法&#xff0c;即文件整体加密、部分内容加密、所有内容加密&#xff0c;以及加密…

理解网络数据传输加密

什么是加密 加密是对明文数据按某种特殊的算法进行加工处理&#xff0c;使其成为不可被直接读取的数据&#xff0c;即密文数据&#xff0c;而密文数据可以通过特定的秘钥解密后还原出明文数据&#xff1b; 为什么需要加密 网络中数据的传输如果是明文的话&#xff0c;在经过…

数据加密方案

1 什么是数据加密 1.1 数据加密的定义 数据加密又称密码学&#xff0c;它是一门历史悠久的技术&#xff0c;指通过加密算法和加密密钥将明文转变为密文&#xff0c;而解密则是通过解密算法和解密密钥将密文恢复为明文。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的…