项目部署和介绍

本文详细介绍了项目部署中的数据加密策略,包括对称加密(如DES、3DES、AES)、非对称加密(如RSA、ECC等)及其应用,秘钥交换过程,以及HMAC和数字签名在保证数据完整性和身份验证中的角色。同时,文章还涵盖了OpenSSL在Windows和Linux系统上的安装与在VisualStudio中的集成使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 项目整体架构图

在这里插入图片描述

  • 项目需求
    • 网络通信中的数据传输 -> 需要保证数据的安全性
      • 对数据进行加密
    • 该项目主要实现的功能:
      • 对网络通信数据进行加解密的模块

项目整体模块划分

  1. 基础组件

    • 数据序列化

      • google protobuf

      • 解决数据的跨平台传输

        • 字节序

        • 计算机位数

          • 32位
          • 64位
        • 字节对齐

          struct A
          {
              int a;	// 4
              char b;	// 1
              char cc;
              int c;	// 4
          };//sizeof(A)=12
          
        • 序列化 -> 编码

          • 将原始数据按照某种格式进行封装 -> 特殊的字符串
          • 将特殊字符串发送给对方
        • 反序列化 -> 解码

          • 接收到序列化的特殊字符串 -> 解析-> 原始数据
          • 按照业务需求处理原始数据
    • 套接字通信

      • tcp
      • 线程池 -> 服务器端使用
      • 连接池 -> 客户端使用
        • 多线程的使用
    • 共享内存操作 -> shm

      • 进程间通信的一种方式
      • 效率最高
        • 之前讲的进程间通信的方式都需要使用fd
          • 管道
            • 匿名 -> 不需要读磁盘
            • 有名 -> 需要磁盘文件
          • 本地套接字
          • 内存映射区 -> mmap
        • 不需要对磁盘文件进行操作
    • 数据库操作

      • 使用oracle
      • 使用oracle官方提供的c++接口
        • OCI
  2. 秘钥协商 服务器 && 客户端

    • 客户端两种实现模式
      • 桌面程序 -> Qt
        • 需要将桌面创建搭建起来
        • 写的qt程序
          • 业务逻辑纯C/C++实现都是可以的
      • 终端交互 -> linux终端 -> 使用这个实现
    • 服务器 -> 后台的守护进程
  3. 图形界面

    • Qt的配置管理终端
  4. 加解密接口(外联接口)的封装

2. 数据的加密和解密

2.1 加密三要素

明文 密文 Encode 加密算法+秘钥 解密算法+秘钥 Decode 明文 密文
  • 加密三要素:

    • 明文/密文

      • 明文 -> 原始数据
      • 密文 -> 加密之后的数据
    • 秘钥

      • 定长的字符串
      • 对称加密 -> 自己生成
      • 非对称加密 -> 有对应的算法可以直接生成
    • 算法

      • 加密算法
      • 解密算法
    • 举例:

      明文: 123
      秘钥: 111
      加密算法: 明文 + 秘钥    
      解密算法: 密文 - 秘钥
      
      加密:  123 + 111 = 密文 == 234
          
      解密: 234 - 11 = 明文 == 123
      

2.2 常用的加密方式

  • 对称加密

    • 秘钥比较短
    • 秘钥只有一个
      • 加密解密使用的秘钥是相同的
    • 加密的效率高
    • 加密强度相对较低( 相对于非对称加密 )
    • 秘钥分发困难 -> 因为秘钥要保密不能泄露
      • 秘钥不能直接在网络环境中进行发送
  • 非对称加密

    • 秘钥比较长
    • 秘钥有两个, 所有的非对称加密算法都有生成密钥对的函数
      • 这两个秘钥对保存到不同的文件中, 一个文件是公钥(比较小), 一个是私钥(比较大)
      • 公钥 -> 可以公开的
      • 私钥 -> 不能公开
    • 加解密使用的秘钥不同
      • 如果使用公钥加密, 必须私钥解密
      • 如果使用私钥加密, 必须公钥解密
    • 效率低
    • 加密强度相对较高( 相对于对称加密 )
    • 秘钥可以直接分发 -> 分发的公钥

#3. 常用的加密算法

3.1 对称加密

  • DES/3DES
  • DES -> 已经被破解了, 不安全
    • 秘钥长度 8byte
    • 对数据分段加密, 每组8字节
      • 得到的密文和明文长度是相同的
    • 3DES -> 3重des
      • 安全的, 效率比较低
      • 对数据分段加密, 每组8字节
      • 得到的密文和明文长度是相同的 == 8字节
      • 秘钥长度24字节, 在算法内部会被平均分成3份, == 每份8字节
        • 看成是3个秘钥
        • 每个8字节
      • 加密处理逻辑:
        • 加密: -> 秘钥1 * 加密算法
        • 解密 -> 秘钥2 * 解密算法
        • 加密 -> 秘钥3 * 加密算法
      • 三组秘钥都不同, 加密的等级是最高的
  • AES
    • 最安全, 效率最高的公开的对称加密算法
    • 秘钥长度: 16字节, 24字节, 32字节
      • 秘钥越长加密的数据越安全, 效率越低
    • 分组加密, 每组长度 16 字节
    • 每组的密文和明文的长度相同 == 16byte
  • Blowfish
  • RC2/RC4/RC5
  • IDEA
  • SKIPJACK

3.2 非对称加密

加密算法

  • RSA(数字签名和密钥交换)
    • 项目中用的是rsa
  • ECC(椭圆曲线加密算法 - 数字签名)
  • Diffie-Hellman(DH, 密钥交换)
  • El Gamal(数字签名)
  • DSA(数字签名)

3.3 秘钥交换过程

// 假设通信的双方为: 客户端C, 服务器端S
// 为什么要交换?
/*
	1. 非对称加密秘钥分发方便, 但是效率低 -> 改进: 需要使用对称加密。
	2. 使用对称加密 -> 秘钥分发困难 -> 改进: 使用非对称加密进行秘钥分发。
		-分发的是对称加密的秘钥, 本质就是一个字符串。
*/

// 秘钥交换的过程:
/*
	1. 在服务器端生成一个非对称加密的密钥对: 公钥, 私钥。
	2. 服务器将公钥发送给客户端, 客户端有了公钥。
	3. 在客户端生成一个随机字符串 -> 这就是对称加密需要使用的秘钥。
	4. 在客户端使用公钥对生成的对称加密的秘钥(随机字符串)进行加密 -> 密文。
	5. 将加密的密文发送给服务器。
	6. 服务器端使用私钥解密 -> 对称加密的秘钥。
	7. 双方使用同一秘钥进行对称加密通信。
*/

3.4 Hash算法 (单向散列函数)

特点:

  • 不管原始数据有多长, 通过哈希算法进行计算, 得到的结果的长度是固定的。
    • 结果是一个二进制的字符串。
  • 只要是原始数据不一样, 得到的结果就不一样。
    • 原始数据差一丢丢, 得到的结果也是完全不同的。
  • 有很强的抗碰撞性。
    • 什么是碰撞: 原始数据不同, 但是通过同样的哈希算法进行计算能得到相同的结果。
    • 推导的结论:数据不同得到的结果就不同。
    • 应用场景:
      • 数据校验:下载的文件提供了散列值,我再对其进行哈希运算,对比两个散列值,查看文件是否被篡改。
      • 登录验证:我们的密码保存在数据库中是以散列值保存的,为了防止泄露。登陆时候密码进行哈希运算和数据库中的值进行比对。
      • 秒传:本地文件进行哈希运算将哈希值传到服务器,服务器搜索是否存在该哈希值,如果存在,秒传成功。
  • 不可逆
    • 得到的结果不能推导出原始数据。

哈希运算的结果:

  • 散列值
  • 指纹
  • 摘要
  • MD4/MD5
    • 散列值长度: 16字节
    • 抗碰撞性已经被破解
  • SHA-1
    • 散列值长度: 20字节
    • 抗碰撞性已经被破解
  • SHA-2
    • sha224
      • 散列值长度: 224bit / 8 = 28byte
    • sha256
      • 散列值长度: 256bit / 8 = 32byte
    • sha384
      • 散列值长度: 384bit / 8 = 48byte
    • sha512
      • 散列值长度: 512bit / 8 = 64byte
  • SHA3-224/SHA3-256/SHA3-384/SHA3-512

5. 消息认证码 -> HMAC

作用:

  • 校验完整性:在通信的时候, 校验通信的数据有没有被篡改。
  • 没有加密的功能。

使用:

  • 消息认证码的本质是一个散列值。
  • (原始数据 + 秘钥) -> 哈希函数 = 消息认证码
    • 最关键的数据: 秘钥

校验的过程:

  • 数据发送方A, 数据接收方B
  • 在A或B端生成一个秘钥: x, 进行密钥分发 -> A和B端都有了 秘钥: x
  • 在A端进行散列值运算: (原始数据 + x) -> 哈希函数 = 得到散列值
  • 在A端: 将原始数据和散列值同时发送给B
  • 在B端: -> AB端使用的哈希算法是相同的
    • 接收数据
    • 校验: (接收的原始数据 + x) -> 哈希函数 = 散列值New
    • 比较散列值: 散列值New 和 接收的散列值 是不是相同
      • 相同: 没篡改
      • 不同: 被修改了

缺点:

  • 秘钥分发困难
  • 不能区分消息的所有者

6. 数字签名

作用:

  • 校验数据有没有被篡改(完整性)
  • 鉴别数据的所有者
  • 不能对数据加密

数字签名的过程: -> 私钥加密数据

  • 生成一个非对称加密的密钥对, 分发公钥
  • 使用哈希函数对原始数据进行哈希运算 -> 散列值
  • 使用私钥对散列值加密 -> 密文
  • 将原始数据和密 文一起发送给接收者

校验签名的过程:

  • 接收签名的一方分发的公钥
  • 接收签名者发送的数据: 接收的原始数据 + 签名
  • 对数据进行判断:
    • 接收的原始数据进行哈希运算 -> 散列值new
      • 和签名的时候使用的哈希函数相同(必须相同)
    • 使用公钥对签名(密文) 解密 -> 得到了散列值old
    • 比较两个散列值
      • 相同: 数据的所有者确实是A, 并且数据没有被篡改
      • 不同: 数据的所有者不是A或者数据被篡改了

4. 安装OpenSSL

4.1 openssl介绍

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。

4.2 openssl的安装和使用

4.2.1 windows下安装openssl

下载地址: http://slproweb.com/products/Win32OpenSSL.html

选择合适的版本进行安装

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下以win32版本安装为例,安装步骤如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

恭喜,OpenSSL安装完成。

将安装目录下的bin添加到系统环境变量中, 方便访问

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2.2 Linux下安装OpenSSL
  1. 下载安装包, 下载地址: https://www.openssl.org/source/

  2. 源码安装包解压缩

    • openssl-1.1.1c.tar.gzip 解压:

      $ tar zxvf openssl-1.1.1c.tar.gzip
      # 加压完成得到目录: openssl-1.1.1c
      
  3. 进入解压目录openssl-1.1.1c, 安装(可参考安装文件INSTALL):

    $ ./config
    $ make
    $ make test 		(可选)
    $ make install	 (使用管理员权限执行该命令)
    
  4. 验证是否安装成功

    $ openssl version -a
    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
    # 根据之前讲的动态库知识解决动态库找不到的问题。
    

    执行命令, 正确的输出结果:

    $ openssl version -a
    OpenSSL 1.1.1c  28 May 2019
    built on: Fri May 31 03:54:40 2019 UTC
    platform: linux-x86_64
    options:  bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr) 
    compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG
    OPENSSLDIR: "/usr/local/ssl"
    ENGINESDIR: "/usr/local/lib/engines-1.1"
    Seeding source: os-specific
    

4.3 VS中使用openssl

打开VS, 创建一个空的控制台应用程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置项目属性, 打开项目的属性面板

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加openssl头文件目录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择安装目录下的 include目录, 里边存储了openssl的头文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加openssl的库目录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置完毕

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.4 测试

4.4.1 VS中的相关设置

打开项目属性窗口, 添加openssl相关的库到项目中

项目属性 -> 链接器 -> 输入 -> 附件依赖项

  • libssl.lib
  • libcrypto.lib

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <openssl/md5.h>		// md5 头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void getMD5(const char* str, char* result)
{
	MD5_CTX ctx;
	// 初始化
	MD5_Init(&ctx);
	// 添加数据
	MD5_Update(&ctx, str, strlen(str));
	// 计算结果
	unsigned char md[16] = { 0 };
	MD5_Final(md, &ctx);
	for (int i = 0; i < 16; ++i)
	{
		sprintf(&result[i * 2], "%02x", md[i]);
	}
}

int main()
{
	char result[33] = { 0 };
	getMD5("hello, md5", result);
	printf("md5 value: %s\n", result);
	system("pause");

	return 0;
}
#输出结果: 
`md5 value: 33b3bc8e05b4fcc16bd531dd9adac166`
4.4.2 Linux下的使用和测试
  1. 编程应用程序, 测试代码如上, 文件名为 md5_test.c

  2. 通过gcc编译源文件

    # 使用的动态库: libcrypto.so
    $ gcc md5_test.c -o md5 -lcrypto
    执行该命令, 需要加载openssl的动态库
    	- libssl.so
    	- libcrypto.so
    

lt[i * 2], “%02x”, md[i]);
}
}

int main()
{
char result[33] = { 0 };
getMD5(“hello, md5”, result);
printf(“md5 value: %s\n”, result);
system(“pause”);

return 0;

}


```shell
#输出结果: 
`md5 value: 33b3bc8e05b4fcc16bd531dd9adac166`
4.4.2 Linux下的使用和测试
  1. 编程应用程序, 测试代码如上, 文件名为 md5_test.c

  2. 通过gcc编译源文件

    # 使用的动态库: libcrypto.so
    $ gcc md5_test.c -o md5 -lcrypto
    执行该命令, 需要加载openssl的动态库
    	- libssl.so
    	- libcrypto.so
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值