实验报告
提交两个实验的实验报告
1. 密码引擎的设计与实现(包含前四次内容)
2. 电子公文传输系统安全性设计方案与实现(包含后四次内容)
3. 推荐Markdown格式
密码引擎的设计与实现
1.实验1 密码引擎-1-OpenEuler-OpenSSL编译
1.新建文件夹
2.安装openssl 并且检查是否可行
3.实践代码(test_openssl.c)
#include <stdio.h>
#include <openssl/evp.h>
int main(){
OpenSSL_add_all_algorithms();
return 0;
}
加分题:
1.下载openssl在windows上
2.配置环境
3.测试代码
#include <openssl/pem.h>
#include <stdio.h>
using namespace std;
int openssl_base64_encode(const unsigned char* in, int inlen, char* out, int* outlen, bool newline)
{
BIO* b64 = BIO_new(BIO_f_base64());
BIO* bmem = BIO_new(BIO_s_mem());
if (!b64 || !bmem) {
fprintf(stderr, "fail to BIO_new\n");
return -1;
}
b64 = BIO_push(b64, bmem);
if (!newline)
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // ignore newlines, write everything in one line
*outlen = BIO_write(b64, in, inlen);
if (*outlen <= 0 || *outlen != inlen) {
fprintf(stderr, "fail to BIO_write\n");
return -1;
}
BIO_flush(b64);
BUF_MEM* buf = nullptr;
BIO_get_mem_ptr(b64, &buf);
*outlen = buf->length;
memcpy(out, buf->data, *outlen);
BIO_free_all(b64);
return 0;
}
int openssl_base64_decode(const char* in, int inlen, unsigned char* out, int* outlen, bool newline)
{
BIO* b64 = BIO_new(BIO_f_base64());
BIO* bmem = BIO_new_mem_buf(in, inlen);
if (!b64 || !bmem) {
fprintf(stderr, "fail to BIO_new\n");
return -1;
}
b64 = BIO_push(b64, bmem);
if (!newline)
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // ignore newlines, write everything in one line
*outlen = BIO_read(b64, out, inlen);
if (*outlen <= 0) {
fprintf(stderr, "fail to BIO_read\n");
return -1;
}
BIO_free_all(b64);
return 0;
}
void base64_test()
{
char jwtHeader[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
printf("jwt header origin:%s\n", jwtHeader);
unsigned char jwtDecode[256] = {0};
int jwtDecodeLen = 0;
openssl_base64_decode(jwtHeader, strlen(jwtHeader), jwtDecode, &jwtDecodeLen, false);
jwtDecode[jwtDecodeLen] = '\0';
printf("jwt header decode:%s\n", jwtDecode);
char jwtEncode[256] = {0};
int jwtEncodeLen = 0;
openssl_base64_encode(jwtDecode, strlen((char*)jwtDecode), jwtEncode, &jwtEncodeLen, false);
jwtEncode[jwtEncodeLen] = '\0';
printf("jwt header encode:%s\n", jwtEncode);
}
int main()
{
base64_test();
return 0;
}
2.密码引擎-2-电子钥匙功能测试
初始化账号:
导入证书
二、在Ubuntu中运行 “龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\linux_mac”中例程,提交运行结果截图
三、加分项:运行“龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows”中例程,提交运行结果截图
1.安装U盘内的GM3000_Setup.exe
2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln
加密20201303.txt
3.测试签名:龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify\Signa_Verify.sln
3.-密码引擎-3-加密API研究
https://www.cnblogs.com/sanfeng-ooo/p/17285166.html
总结使用方式
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
具体API函数
参考链接:https://blog.csdn.net/liuhuiyi/article/details/7778123
1.基本加密函数
-
(1)CSP独立加密模块
-
(2)服务提供者函数
-
(3)密钥产生交换函数
-
(4)编码解码函数
-
(5)加密解密函数
-
(6)HASH和签名函数
2.证书和证书库函数
(1)证书库函数
(2)维护和证书函数
3.证书验证函数
(1)使用CTL 的函数
(2)证书链验证函数
4.消息函数
5.其他辅助函数
PKCS#11
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
PKCS密码中间件位于上层应用和底层安全设备之间,应用基于 PKCS#11 标准接口开发各类应用程序。主要包括2个库
主API库:提供给应用的PKCS11接口。
tokenDLL库:由主 API 库调用,完成从上向下到指定设备的套接。
安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。
PKCS #11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限,而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象,PKCS #11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
PKCS#11创建和支持下列对象:
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话Session当中,一旦会话结束,这类对象也跟着被删除。
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
1.SKF接口
文件地址:龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln
2.API接口
3.PKCS#11
DES:
DES3:
RC2:
RC4:
RSA:
AES:
4.getusbinfos.sln
4.密码引擎-4-国䀄算法交叉测试
https://www.cnblogs.com/sanfeng-ooo/p/17328618.html
1.在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图
2.在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)
检验:
3.在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用OpenSSL SM2算法计算Hash值的签名,用龙脉eKey进行验签,提交代码和运行结果截图
实验二
安全策略
一、总体概述
整体方案设计的安全取决于系统运行物理环境的安全性、服务器及网络的安全性、操作系统的安全性、应用
系统的安全性及应用数据的安全性等,通过设计实施整体的安全策略,对安全策略的实施结果进行评估。之
后如若出现安全性措施问题,可以及时采用安全方案解决。
二、电子公文传输系统面临的安全威胁
本系统作为电子公文管理系统,需要考虑以下5点安全威胁:
- 人为因素:操作问题,社会学攻击等;
- 非人为因素:服务器病毒,数据库泄露等;
- 信息:信息泄露、信息窃取、假冒等;
- 软件:系统软件安全漏洞等。
- 其他因素:非前面四点的因素
三、安全策略
在系统实施过程中遵循以下方面的安全策略:
(一)网络安全
- 要求
保证主要网络冗余,保证通信线路畅通。
加强网络访问控制
- 网络安全
本系统构建在专有内部网络,部署遵循网络架构,不同功能层/区之间的访问严格按照点对点进行访问控制。
网络中安装防火墙,进行访问检测、监测、控制、审查分析,阻止非法恶意攻击入侵,高级别的保护可以禁
止一些服务,如Java、ActiveX、JavaScript脚本等,阻止恶意代码进入。
服务器及客户端系统安全
为避免单点故障,应用服务器、数据库服务器等需采用集群配置。
对于服务器操作系统,进行相应的安全配置维护管理,及时打补丁,安装反病毒程序,定期查杀病毒,根据
实际情况及时进行安全策略调整,定期进行有关系统的数据备份。
对于数据库系统,进行相应的安全配置维护管理,并且定期进行数据库系统的有关备份;
由于客户端计算机重要性十分突出,因此病毒感染、恶意攻击等可能会进一步影响到服务器,因此,对客户
端计算机也要采取安全措施,进行相应的安全配置管理,如设置有效的系统密码,设置较高的浏览器级别,
及时打补丁,安装反病毒程序,定期查杀病毒,根据实际情况及时采取安全措施。
终端准入机制
系统具备终端准入机制,只能允许已经注册认证的合法终端才能够访问系统服务,也就是黑白名单机制。(二)主机安全
- 安全方式
(1)身份认证与鉴别
系统提供完备的权限管理、用户认证、密钥管理方案。
系统支持多机关部门认证机制。
系统支持用户认证失败超过5次后锁定,用户锁定后需要向管理员对其进行解锁
忘记密码可以向管理员提交申请进行密码重置。
密码认证存在有效期机制,超过限定时间后会自动要求用户修改密码。
系统可控制用户登陆地点,通过机构下可使用IP地址范围,限定不在IP地址范围内终端不得登陆。
鉴别机制(采用用户名和口令机制)
输入口令字时以“*”回显。
用户的口令以及加密所用数据是以密文方式存在数据库中。
用户认证通过后,如果在一定时间内(该时间可以通过配置文件设定)无操作,需要重新认证。
鉴别失败处理
当用户连续鉴别错误次数超过门限条件时(该次数可以通过配置文件设定),将该用户锁定,该用户必须通
过管理员解锁。
应用系统中的口令规范
系统限制口令长度至少六位。
口令存储的密码技术使用与密码支持按本页密码支持的要求。
系统初始化用户时,默认密码为指定字符串,用户后续登录系统时强制要求修改初始密码。
(2)资源利用
系统能够对应用系统的最大并发会话连接数进行限制。
(三)应用安全
- 要求
对用户进行资源访问授权
通信完整性,通过哈希值、摘要保证通信完整性
通信保密性要求,通过专用的通信协议或加密的方式保证通信过程的加密性
系统提供完整的系统日志
- 应用安全访问控制机制
系统权限控制以角色为权限集合,控制用户权限。
①系统功能(菜单)
②页面表单元素(文本框、下拉框、按钮等)操作
③列表一条数据的查看、修改、删除。
系统支持用户会话超时失效,自动退出功能
系统提供完善的日志管理体系。系统对用户登录情况,如登录用户、进入时间、操作功能项等进行自动记
录; 对于数据录入、数据提交、任务开始和数据分析等应用处理的时间、数据范围、 执行情况等也自动记录
日志,以便出问题时跟踪追查审计。
系统对请求的数据报文都记录接受时间,响应时间,接口报文,操作员,请求成功标识等信息,便于追踪请
求数据的正确性及及时找出错误原因。
安全审计机制
系统具有机构、用户、交易的安全控制审计机制。
系统通过身份及密码验证、操作日志登记及查询、系统日志登记及查询、交易复核及授权、交易权限配置等
机制,保证系统的安全。系统在客户端登陆,服务端会签发一个token发送给客户端,客户端将token存储在
cookie里,后面客户端访问服务端都需要带着token去访问,服务端首先要对客户端token进行验证,通过后
才允许访问。
具体数据访问后会安全存放在日志中,在日志功能里会详细说。
对于传输公文的加密和防篡改上,可以对报文进行sm3计算,然后将计算的值放入报文头中,系统得到报文
之后对报文体在进行sm3计算,然后将计算的值跟报文头中的sm3值进行比较,以确保报文未被篡改,保证
数据传输的安全性。
系统在数据库层和应用层,进行严格的操作权限控制,防止对数据和系统日志文件进行直接修改。
加密算法支持
系统符合GMT 0054-2018 《信息系统密码应用基本要求》和 国家标准GB/T 39786-2021《信息安全技术 信
息系统密码应用基本要求》最新规定及要求,支持国密算法,包括:SM1对称加密算法,SM2公钥算法,
SM3密码杂凑算法,其中SM1对称加密算法,采用硬件实现;SM2国家密码管理局公布的公钥算法;SM3密
码杂凑算法。系统日志
系统提供所有类的日志查询功能。
系统提供所有类的日志导出功能。
日志的安全保护措施
日志记录中包含了时间戳,避免非法篡改;
日志自身可以变更日志策略,自行修改访问黑白名单;
日志中的敏感数据支持字段级配置化加密;
日志表中的数据可以配置数据清理策略,将历史数据的持久化纳入全行级数据生命周期管理中。
(四)数据安全
数据备份策略
该公文传输系统在实施过程中将提供完备的和切实可行的数据备份与恢复方案。
公文传输在公文传输的过程中很可能存在文件丢失的问题,
数据库运行在归档日志模式,可以联机在线进行备份,不影响数据库的访问。数据表采用定期归档、备份策
略;
定期(如:每个月进行)将数据表进行清理,将过期数据导入归档数据库,并对归档库进行备份;
同时,对在线库进行定期(全备可以定为每月)全备,并结合每天增量备份的方式;
归档、备份时不影响系统运行。
一般性数据恢复时首先确定恢复数据和时点,并从备份数据中先恢复全量备份,再恢复之后的增量备份,完
成恢复。
对于灾难性恢复,则通过恢复最近一次的数据备份及源系统数据进行数据追补。日常备份最小时间间隔不大
于1 天,以保障灾难发生时数据丢失小于24小时的文件。
因此我们计划备份存在24小时内的文件,过24小时更新一次文件内容,为所有用户提供24小时的可回复的文
件服务。
(2)数据传输安全
系统支持数据存储、数据传输、密钥管理等方面的安全功能。系统与其他系统间的数据交互,采用数据接口
文件方式进行,系统之间数据库不互相开放。传输过程中建议对数据进行压缩、加密,实现数据安全可控传
输。
我们计划将在用户客户端与WEB、应用服务器间支持采用HTTPS协议,对数据传输过程进行加密。
具体实践实现
加密哪些数据? 对登陆用密码,文件具体内容,文件传输过程都进行了加密,数据库出现的信息也都是密态处理的
如何加密? SM2,SM3,SM4同态加密
用户登录密码加密:使用国密算法SM3进行哈希计算,将用户的登录密码哈希后存储在数据库中。当用户登录时,将输入的密码进行同样的哈希计算,然后与数据库中的哈希值进行比较,以验证密码的正确性。
公文文件加密:使用国密算法SM4进行加密,将公文文件加密后存储在数据库中。具体的加密方法可以参考之前回答中提供的SM4加密示例代码。
加密密钥存储:为了安全地存储加密密钥,您可以使用国密算法SM2进行非对称加密。首先,生成一对SM2密钥(公钥和私钥),然后使用公钥加密SM4的密钥,将加密后的密钥存储在数据库中。当需要解密公文文件时,使用私钥解密加密后的SM4密钥,然后使用解密后的SM4密钥对公文文件进行解密。