数据传输过程加密方案

前言

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

数据加密方案

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

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

采用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。

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
心建设方案是一个复杂且多元化的项目,涉及硬件、网络、安全、能源效率等多个方面。以下是一个全面的数据心建设方案概述: 1. 项目目标与需求分析 项目目标:建立一个高效、安全、可扩展的数据心,以满足公司未来的业务需求。 需求分析:分析公司当前的业务需求、预计的增长速度、数据心的用途(如存储、处理、备份等)以及预算等因素。 2. 场地选择与设计 场地选择:选择地理位置合适、基础设施完善、环境安全可靠的场地。 建筑设计设计符合数据心需求的建筑,包括防火、防震、防水、防电磁干扰等措施。 3. 硬件与设备选择 服务器:选择高性能、可扩展的服务器,满足业务需求。 存储设备:选择高速、高容量的存储设备,确保数据的快速访问和备份。 网络设备:选择高性能的网络设备,确保数据传输的稳定性和速度。 UPS与供电设备:选择稳定的UPS和供电设备,确保数据心的电力供应。 冷却设备:选择高效的冷却设备,确保数据心的温度和湿度控制在合适范围内。 4. 网络架构与安全设计 网络架构:设计合理的网络架构,确保数据传输的高效性和安全性。 安全设计:采取多种安全措施,如防火墙、入侵检测、数据加密等,确保数据心的安全。 5. 能源效率与环保设计 能源效率:选择节能设备和技术,优化能源使用,降低运行成本。 环保设计:采用环保材料和技术,减少对环境的影响。 6. 监控与管理系统设计 监控系统:设计全面的监控系统,实时监控数据心的各项指标,如温度、湿度、电力供应等。 管理系统:建立高效的管理系统,实现数据心的集管理和控制。 7. 实施与测试 实施:按照设计方案进行数据心的建设。 测试:完成建设后进行全面的测试,确保数据心的各项功能正常运行。 8. 维护与升级 维护:建立专业的维护团队,定期对数据心进行维护和保养。 升级:根据业务需求和技术发展,对数据心进行升级和扩展。 9. 预算与成本控制 制定详细的预算计划,合理分配资金,确保项目的顺利进行。 在建设过程严格控制成本,避免不必要的浪费。 10. 法规与合规性 确保数据心的建设和运营符合相关的法规和标准,如《数据设计规范》等。 关注最新的法规动态,及时调整数据心的运营策略。 综上所述,数据心建设方案是一个涉及多个方面的综合性项目。通过合理的规划、设计和实施,可以建立一个高效、安全、可扩展的数据心,为公司的业务发展提供坚实的支撑。
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
jQuery本身并不能实现加密传输,但可以配合其他技术实现数据的加密传输。 在Web开发,常见的加密传输方案是使用HTTPS协议。HTTPS通过SSL或TLS协议对通信进行加密,确保数据在传输过程不被窃取或篡改。而jQuery可以用来发送求,并与服务器进行交互,从而实现加密传输。 使用jQuery发送加密求的步骤如下: 1. 在Web服务器上配置SSL证书,启用HTTPS服务。 2. 使用jQuery编写前端代码,将数据通过HTTPS协议发送给服务器。 3. 在服务器端对接收到的数据进行解密。 在前端使用jQuery发送加密求时,可以使用jQuery的ajax方法发送POST或GET求,并在求的设置指定使用HTTPS协议。例如: ```javascript $.ajax({ url: 'https://example.com/api', type: 'POST', data: encryptedData, // 将加密后的数据作为求的参数 dataType: 'json', success: function(response) { // 处理服务器返回的数据 }, error: function(xhr, status, error) { // 处理求错误 } }); ``` 在服务器端接收到加密数据后,可以使用相应的后端技术(如PHP、Java等)进行解密,并对数据进行处理和响应。 需要注意的是,使用jQuery进行加密传输只是一种前端技术,真正的加密传输是在服务器与客户端之间的通信链路上进行的。因此,在实际应用,除了使用jQuery之外,还需要配置和管理服务器端的加密协议和证书等内容,以保证数据的安全传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值