OpenSSL测试-SM3
Posted 西宁西
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL测试-SM3相关的知识,希望对你有一定的参考价值。
OpenSSL测试-SM3
任务详情
- 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
- 使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图(5\')
- 使用OpenSSL编程对计算"你的8位学号"SM3摘要值,提交代码和运行结果截图。(10’)
- 使用OpenSSL编程对计算内容为"所有同学的8位学号"的文件的SM3摘要值,提交代码和运行结果截图。(选做(10’))
使用OpenSSL的命令计算你的8位学号的摘要值(SM3)
使用命令echo -n "20201205" | openssl dgst -SM3
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
void tDigest()
unsigned char sm3_value[EVP_MAX_MD_SIZE]; //保存输出的摘要值的数组
int sm3_len, i;
EVP_MD_CTX *sm3ctx; //EVP消息摘要结构体
sm3ctx = EVP_MD_CTX_new();//调用函数初始化
char msg1[] = "Test Message1"; //待计算摘要的消息1
char msg2[] = "20201212"; //待计算摘要的消息2(我的学号)
EVP_MD_CTX_init(sm3ctx); //初始化摘要结构体
EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL); //设置摘要算法和密码算法引擎,这里密码算法使用sm3,算法引擎使用OpenSSL默认引擎即软算法
EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1));//调用摘要UpDate计算msg1的摘要
EVP_DigestUpdate(sm3ctx, msg2, strlen(msg2));//调用摘要UpDate计算msg2的摘要
EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len);//摘要结束,输出摘要值
EVP_MD_CTX_reset(sm3ctx); //释放内存
printf("原始数据%s和%s的摘要值为:\\n",msg1,msg2);
for(i = 0; i < sm3_len; i++)
printf("0x%02x ", sm3_value[i]);
printf("\\n");
int main()
OpenSSL_add_all_algorithms();
tDigest();
return 0;
使用OpenSSL编程对计算"你的8位学号"SM3摘要值
- 使用OpenSSL编程对计算内容为"所有同学的8位学号(文本)"的文件的SM3摘要值
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
void tDigest()
unsigned char sm3_value[EVP_MAX_MD_SIZE];
int sm3_len, i;
EVP_MD_CTX *sm3ctx;
sm3ctx = EVP_MD_CTX_new();
char msg1[10000] = "";
FILE *file;
char line[32];
char *ret;
file = fopen("id.txt", "r");
if (!file)
printf("文件打开失败!\\n");
return 1;
while (ret = fgets(line, sizeof(line), file))
strcat(msg1,line);
printf("id.txt中的内容为\\n%s\\n",msg1);
fclose(file);
EVP_MD_CTX_init(sm3ctx);
EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL);
EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1));
EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len);
EVP_MD_CTX_reset(sm3ctx);
printf("id.txt的摘要值为:\\n");
for(i = 0; i < sm3_len; i++)
printf("0x%02x ", sm3_value[i]);
printf("\\n");
int main()
OpenSSL_add_all_algorithms();
tDigest();
return 0;
国密算法 + MySQL
中国加密标准
中国加密标准的SM1、SM2、SM3、SM4、SM7、SM9等。 借助国际加密标准,我们可以利用来自开源的加密库, 例如,最常用和最流行的加密库之一是 OpenSSL。
本文旨在使用有 SMx(中国加密库)的“OpenSSL”库 的 BabaSSL,加上 MySQL的TLS设置,提供使用国密的算法的 MySQL。BabaSSL不是唯一采用 MySQL 的中国加密标准, 来自其他的中国加密供应商/开源的/兼容的/最新的 OpenSSL 库, 也会支持类似的方式来实现MySQL国密TLS加密。
测试环境(用于分享)
1.计算机资源(VM)
2. 操作系统 - 计算 机VM 配备 Oracle Linux 8
3. 通过公用 yum 的存储库安装MySQL 社区版本8.0
4. 使用 BabaSSL 8.3 [ BabaSSL 8.3.2-dev ]。它基于 2020 年 9 月 22 日的 OpenSSL 1.1.1h 版本
介绍
MySQL 利用 OpenSSL 库通过通信通道为密码提供 TLS 加密。为了允许使用中国标准和 MySQL 切换 OpenSSL 库,可使用OpenSSL兼容的BabaSSL以强制使用中国加密标准进行通信。
安装和使用
1. 提供虚拟机和操作系统/包更新
2.下载BabaSSL 8.3.2稳定源代码
3.Compile BabaSSL并以安装
4. 安装 MySQL 8.0.30(来自 yum 存储库)
5. 使用 SMx for MySQL 配置 TLS
6. 使用 BabaSSL 库路径来更改 mysqld 的系统服务
7.重新加载并重启mysqld服务
8. MySQL (mysql) 客户端与 BabaSSL 库通过 TLS 与 SMx 连接
配置虚拟机和操作系统/包更新
计算实例 (VM) 使用 Oracle Linux 8 进行配置。VM 配置好并准备好连接,登录到 shell 终端并进行更新
从终端 Terminal SSH 登录
ssh -i <privatekey> opc@<public IP>
sudo yum update
sudo yum install wget
下载 BabaSSL 8.3.2 稳定源代码
要下载 8.3 稳定源 zip 文件,并执行以下命令和解压 zip文件
wget https://github.com/Tongsuo-Project/Tongsuo/archive/refs/heads/8.3-stable.zip
unzip 8.3-stable.zip
要Compile代码,请将目录更改为解压后的文件目录“Tongsuo-8.3-stable”并执行以下命令:
cd Tongsuo-8.3-stable
mkdir bld
../config
make
BabaSSL的安装 会放于 /usr/local/bin 和 /usr/local/lib64 以及相应的默认安装路径。
注意:默认安装不会替换任何标准操作系统系统自带的 OpenSSL档案,而是将其放入 /usr/local 作为選用安装。
sudo make install
最后,更改 /etc/profile 并附加以下内容
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
退出终端并重新登录虚拟机
以SSH 连接到附加了新库路径的计算 VM (来自更新过的 /etc/profile)。
并检查 BabaSSL 和 SMx 加密,执行以下命令并验证是否安装 BabaSSL成功。
openssl version
openssl -v ciphers|grep SM
结果显示如下:
BabaSSL 8.3.2-dev
OpenSSL 1.1.1h 22 Sep 2020
TLS_SM4_GCM_SM3 TLSv1.3 Kx=any Au=any Enc=SM4-GCM(128) Mac=AEAD
TLS_SM4_CCM_SM3 TLSv1.3 Kx=any Au=any Enc=SM4-CCM(128) Mac=AEAD
利用 yum 存储库安装 MySQL 8.0.30
在 SSH 终端上,执行以下命令来安装 mysql 社区版本
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
sudo yum module disable mysql
sudo dnf install mysql-server
启动mysqld服务,修改密码并查看连接信息
这个时候的TLS连接时使用操作系统上的OpenSSL (=没开通的国密TLS)
sudo systemctl start mysqld
查看root 的 临时密码, 以临时密码登陆的是不可以使用正常SQL命令。要先改密码
sudo cat /var/log/mysqld.log|grep temp
mysql –uroot –h127.0.0.1 –p
mysql > set password=‘…..’;
mysql > status
查看“status”信息结果,显示使用Cipher是 TLS_AES_256_GCM_SHA384.
修改 /etc/my.cnf 以使用 SMx 密码附加 TLS 设置。
require_secure_transport=ON
tls_ciphersuites=TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3
tls_version=TLSv1.3
更改 mysqld 的系统服以至使用 BabaSSL 库路径
- 更新 mysqld.service 并添加带有 LD_LIBRARY_PATH 的 ENVIRONMENT 行以采用 BabaSSL
sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
查找文件上的“Environment=MYSQLD_PARENT_PID=1”一行,并在后面添加以下一行
Environment=LD_LIBRARY_PATH=/usr/local/lib64
重新加载并重启 mysqld 服务
执行以下命令重新加载系统服务并启动mysqld
sudo systemctl daemon-reload
sudo systemctl restart mysqld
从 /var/log/mysqld.log 检查 mysqd.log 加密连接支持信息正确无错
日志消息显示 TLS 连接已配置。
MySQL (mysql) 客户端与 BabaSSL 库通过 TLS 与 SMx 连接
要使用 SMx 连接通过 TLS 登录 MySQL,“mysql”客户端必须与 BabaSSL 库一起运行。确保 LD_LIBRARY_PATH 具有 /usr/local/lib64 并将 mysql 客户端登录到 MySQL 服务器
mysql -uroot -h127.0.0.1 -P3306 -p -e "status;"
状态屏幕显示 SSL 连接使用的Ciphers是 TLS_SM4_GCM_SM3。
在mysql客户端执行以下SQL命令来看看TLS/SSL信息
mysql > show variables like '%tls%';
mysql > show status like '%tls%';
结果显示
mysql> show variables like '%tls%';
+------------------------+---------------------------------+
| Variable_name | Value |
+------------------------+---------------------------------+
| admin_tls_ciphersuites | |
| admin_tls_version | TLSv1.2,TLSv1.3 |
| tls_ciphersuites | TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3 |
| tls_version | TLSv1.3 |
+------------------------+---------------------------------+
4 rows in set (0.00 sec)
mysql> show status like '%tls%';
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| Current_tls_ca | ca.pem |
| Current_tls_capath | |
| Current_tls_cert | server-cert.pem |
| Current_tls_cipher | |
| Current_tls_ciphersuites | TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3 |
| Current_tls_crl | |
| Current_tls_crlpath | |
| Current_tls_key | server-key.pem |
| Current_tls_version | TLSv1.3 |
| Tls_library_version | OpenSSL 1.1.1h 22 Sep 2020 |
+--------------------------+---------------------------------+
10 rows in set (0.01 sec)
VM 上的 MySQL 服务器/客户端使用 SMx TLS 连接运行 BabaSSL 8.3.2。
参考链接
https://zhuanlan.zhihu.com/p/132352160
https://github.com/Tongsuo-Project/Tongsuo
https://dev.mysql.com/downloads/repo/yum/
感谢您关注“MySQL解决方案工程师”
《深入浅出MGR》视频课程
戳此小程序即可直达B站
https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0
文章推荐:
想看更多技术好文,点个“在看”吧!
以上是关于OpenSSL测试-SM3的主要内容,如果未能解决你的问题,请参考以下文章
Centos7 编译安装 Openssl 1.1.1 支持国密标准