网络安全工程实训——应用密码学实验

一、实验目的:

(1)掌握openssl的安装与使用

(2)熟悉了解PKI的组件构成及其概念,包括证书、证书授权中心和数字签名。理解PKI如何防范中间人攻击

(3)了解双证书体系与双证书功能上的差异

(4)理解SSL/TLS实现数据安全传输的流程

(5)接触了解后量子密码算法

二、实验原理或预习内容

(1)教材涉及PKI的章节

(2)SSL/TLS实现数据安全传输的流程

三、实验环境

实验环境基于SEED Ubuntu 20.04 VM

四、实验内容

openssl是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。

我的命令前没有位置,因为安装的时候放在大文件夹下了,如果有同学代码不通过,请尝试在openssl前加:/opt/openssl/bin/,如:

/opt/openssl/bin/openssl --version

 任务一:编译Openssl 3.x版本,运行test通过

1.安装步骤:

(1)安装编译依赖包:

sudo apt update
sudo apt install gcc make  zlib1g-dev  libpam0g-dev libkrb5-dev libedit-dev -y

(2)克隆openssl项目

git clone https://github.com/openssl/openssl.git openssl-3.2

(3)进入项目执行并指定安装路径:

LDFLAGS="-Wl,-rpath -Wl,/opt/openssl/lib64" ./config shared --prefix="/opt/openssl"

(4)执行make命令进行编译,然后使用make install命令进行安装:

sudo make 
sudo make install

 (5)查看安装的openssl版本,运行命令:

openssl version

 任务二:使用Openssl RSA和ECDSA两种算法,分别生成RSA和ECDSA证书密钥对

   公钥基础设施是当今互联网通信的一个必要的基础支撑。每个公钥证书主要由公钥和它的拥有这,以及认证机构的签名组成。证书接受者可以验证签名保证证书的完整性并得知公钥的真正拥有者。假设一个银行想要将公钥技术用于其在线银行网站(book32.com),该银行需获取一个X.509证书。在现实世界中,从CA获取这样的一个证书需要花费一定费用。在模拟场景中,可自行充当CA。模拟的认证机构叫做ModelCA。申请数字证书的基本过程如下。首先需要为ModelCA生成私钥和自签名证书。银行根据自身需求采用双证书体系,其生成两张证书请求(CSR),其中包含获得证书所需域名book32.com和公钥,银行把请求提交给ModelCA。ModelCA对请求中信息进行验证。一旦信息验证通过,ModelCA用自身私钥为其生成数字证书。

                                                                        4.1 opt框架

(1)在当前工作目录下创建目录demoCA,执行

mkdir demoCA
cd demoCA
mkdir certs crl newcerts private
touch index.txt serial //创建两个文件index.txt 和serial
echo 1000 > serial //在serial文件写入1000,用于记录证书,作为                    所签名证书的序列。

 (2)生成根证书私钥

openssl genrsa -des3-out ./demoCA/private/cakey.pem 4096

 (3)生成自签名根证书

openssl req -x509  -days 3650 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem -subj "/CN=www.modelCA.com/O=Model CA LTD./C=US"

 

2.生成RSA加密证书

(1)生成RSA私钥server.key及证书请求文件server.csr

openssl req -newkey rsa:2048 -sha256 -keyout server.key -out server.csr -subj "/CN=www.bank32.com/O=Bank32 Inc./C=US" -passout pass:dees

 (2)向modelC请求签名生成证书

openssl ca -policy policy_anything -in server.csr -out server.crt -batch 

 

 (3)验证证书签名

openssl verify  -partial_chain -CAfile ./demoCA/cacert.pem  -verbose server.crt

3.生成ECDSA签名证书

(1)生成ecdsa私钥

openssl ecparam -name prime256v1 -genkey -out ecdsa.key

 (2)生成证书请求文件

openssl req -new -key ecdsa.key -out ecdsa.csr -subj "/CN=www.bank32.com/O=Bank32 Inc./C=US" -passout pass:dees

 (3)向modelCA请求签名生成数字证书

openssl ca -policy policy_anything -in ecdsa.csr -out ecdsa.crt -batch

 (4)验证数字签名

openssl verify  -partial_chain -CAfile ./demoCA/cacert.pem  -verbose ecdsa.crt

 

任务三:使用SM2双证书模拟文件加密传输

   数据在互联网中传输是如果未受保护,很容易被他人读取甚至修改。应用程序为保证通信安全,需要加密数据并且解释数据的完整性。目前为方便应用程序之间彼此通信,他们需遵循同一个标准,传输层安全协议(TLS)。TSL从先前SSL(secure socket layer)发展而来,SSL被IETF标准化时,重新命名为了TLS。

                                                             4.2 TLS握手流程

  openssl封装了密码算法,利用其中加密算法根据TLS数据传输流程模拟以下情景。

  客户端A使用https协议向服务端B请求文件,建立TSL连接,协定使用AES/SM4加密算法及加密模式和会话密钥。服务端B使用协定好的加密参数将文件加密后传输给客户端A,其中服务端B使用双证书协议。

流程如下:

1.客户端A与服务端B执行TLS握手协议建立TLS连接

客户端A与服务端B建立tcp连接后,使用TLS握手协议建立协定共同参数并生成会话密钥。首先客户端A发送客户端问候(Client hello),表明自己所支持的密码套件。服务端接受Client hello后,返回Server Random决定双方都支持的密码套件。 之后服务端B发送所拥有的加密证书及签名证书,并发送服务器问候完成消息(Server Hello Done),表明已完成握手协商。客户端A对服务端B发送来的证书进行验证。

(1)客户端A对服务端B发来的证书进行验证

openssl verify  -partial_chain -CAfile ./demoCA/cacert.pem  -verbose ecdsa.crt//签名证书
openssl verify  -partial_chain -CAfile ./demoCA/cacert.pem  -verbose server.crt//加密证书

 若验证通过,客户端A向服务器端B发送客户端密钥交换(Client Key Exchange)消息。发送一个使用服务器加密证书公钥加密的随机生成的预主密钥。我们手动创建一个密钥文件来模拟。

 (2)客户端A生成预主密钥

openssl rand -out key 32

 (3)客户端A提取客户端B的加密证书中公钥

openssl x509 -in server.crt -pubkey -noout >rsa_public.key

 (4)客户端A使用加密公钥加密预主密钥

openssl pkeyutl -encrypt -pubin -inkey rsa_public.key -in key -out enckey

  服务端B收到后使用加密私钥进行解密,之后客户端A、服务器端B使用预主密钥来生成会话密钥。简略操作,我们直接将发送的预主密钥当作会话密钥使用。

(5)客户端B使用加密私钥解密预主密钥

openssl pkeyutl -decrypt -inkey server.key -in enckey -out deckey

 之后客户端A与服务器端B之间发送更改密码规范(Change Cipher Spec)消息,告知进一步的通信将被加密。最后互相发送一个加密的完成(Finished)消息,其中双方验证之前交换的信息,验证失败握手协议将失败,TLS连接中断。验证成功则完成TLS握手协议。

 

2.TLS数据传输

   客户端A和服务器B端完成握手协议后,他们可以开始交换数据。由于非对称加密算法的速度问题,数据加密采用对称加密算法。服务器端B使用TLS握手阶段商议选择好的密钥套件(这里我们使用AES/SM4对称加密算法)、加密工作模式及会话密钥加密客户端A请求的文件。通过TLS发送数据之前会把数据分块,并在加密前为每块生成一个MAC。TLS将每个加密后的块放送TLS记录的有效载荷字段中,然后将记录提供给传输层进行传输。但这种通过组合加密和认证算法的MTE方案(MAC then ENcryption)被逐渐意识到存在有安全问题。后提出一些真正的AEAD算法。常见的有AES-128-GCM、AES-256-GCM。GCM全称为 Galois/Counter Mode,其中 G 是指 GMAC,C 是指 CTR 模式,可以将 GCM 认为是认证模式的一种,提供认证和加密两种功能。但openssl目前不支持AEAD算法,这里我们采用CBC加密模式加密数据,并使用签名私钥进行签名。

                                                   4.3使用TLS记录协议发送数据的过程

touch req_file
echo “hello TLS” > req_file

(6)服务器端B使用约定会话密钥加密

openssl enc -e -aes-256-cbc -in req_file -out enc_file -pass file:deckey

 (7)服务器端TLS协议使用签名私钥对文件签名

openssl pkeyutl -sign -in enc_file -inkey ecdsa.key -out file_sig -rawin

   客户端A接受到文件后,对文件使用服务端B签名公钥验签检查其完整性,并使用会话密钥解密。

(8)服务端A提取签名证书公钥

openssl x509 -in ecdsa.crt -pubkey -noout >ecdsa_public.key

 (9)使用签名公钥验签,若签名失败则表明数据完整性被破坏

openssl pkeyutl -verify -pubin -in plaintext -inkey ecdsa_public.key  -sigfile file_sig  -rawin 

 (10)使用会话密钥解密文件

openssl enc -d -aes-256-cbc -in enc_file -out dec_file  -pass file:key

 (11)查看加解密文件 

 任务四:测试后量子算法标准CRYSTALS-Kyber,对比和RSA\ECDSA在性能上的不同(附加实验)

  针对量子计算机威胁,目前已有对应的后量子算法。Openssl OQS是提供程序使Openssl能够利用抗量子算法的模块。为Openssl 和OQS程序集成需准备Openssl、liboqs,OQS程序。

  liboqs为开放量子安全(OQS)项目一部分,是一个用于安全加密算法的开源c库。项目地址:GitHub - open-quantum-safe/liboqs: C library for prototyping and experimenting with quantum-resistant cryptography

  oqs-provider用于在Openssl3.x发行版本中启用量子安全加密(QSC)。项目地址:https://github.com/open-quantum-safe/oqs-provider

  安装liboqs、oqs-provider并启动oqs-provider程序,测试其中后量子算法标准CRYSTALS-Kyber并进行性能对比。

五、实验结论及思考题

  1. X.509数字证书包含那些内容

     ①证书的版本信息。

     ②证书的序列号,每个证书都有一个 唯一的证书序列号。

     ③证书使用的签名算法。

     ④证书的发行机构名称。

     ⑤证书的有效期。

     ⑥证书所有人的名称。

     ⑦证书所有人的公开密钥。

     ⑧证书发行者对证书的签名。

(2)SSL握手期间,浏览器会做两个重要的验证。一个是核对接收到的证书是否有效。第二个验证是什么?这两个验证的目的分别是什么?

  ① 第二个验证是验证证书绑定的域名是否与正在访问的网址一致。

  ② 第一个验证包括检查证书是否由受信任的证书颁发机构(CA)颁发,证书是否过期,以及证书是否被撤销。这个验证的目的在于确保与浏览器建立连接的服务器是合法和可信的,从而防范中间人攻击等安全威胁;第二个验证是验证证书绑定的域名是否与正在访问的网址一致。浏览器使用HTTPS协议与Web服务器握手时,会从服务器返回的SSL证书中解析出证书绑定的域名。如果SSL证书绑定的域名与用户请求连接的网址不一致,浏览器会提示“不安全”并终止连接。这个验证的目的在于防止用户在假冒的网站上输入敏感信息,保护用户数据的安全。

(3)有哪些对公钥基础设施上实施攻击的案例

  对公钥基础设施上实施攻击的类型有:中间人攻击、伪造证书攻击、私钥泄露攻击、证书颁发机构被攻击。

  ①中间人攻击:京东金融Ver 2.8.0由于证书校验有缺陷,导致https中间人攻击,攻击者直接可以获取到会话中敏感数据的加密秘钥,另外由于APP没有做加固或混淆,因此可以轻松分析出解密算法,利用获取到的key解密敏感数据。

  ②伪造证书攻击:7 月 19 日,位于荷兰的数字证书颁发机构 DigiN- otar,为网络犯罪分子颁发了证书,这使得黑客可以向许多域发送欺诈公钥证书请求,包括搜索引擎巨头谷歌所拥有的网站,让黑客获得了使用流氓 SSL 证书劫持 Gmail 帐户,以及使用 SSL 和 EVSSL 数字证书欺诈安全网站的能力。该盗用证书潜在地影响了试图访问 Google 旗下网站的互联网用户,并可用于欺骗 Web 内容,进行钓鱼攻击或对最终用户执行中间人攻击。这是继今年 3 月 Comodo和 6 月 StartSSL 数字证书遭盗用之后,又一起黑客攻击数字证书系统的恶劣事件。

  ③私钥泄露攻击:Wintermute钱包遭攻击损失约1.6亿美元,被盗原因是Wintermute为了节省Gas费使用了Profanity来创建Vanity钱包(开头0x0000000),此前去中心化交易所聚合器1inch发布了一份安全披露报告,声称通过名为Profanity的工具创建的某些以太坊地址存在严重漏洞。慢雾安全团队对此事件进行了深入分析,并分享给大家。

(4)HTTPS可以防御中间人攻击,但是可以安装HTTPS代理来监视和修改HTTPS流量。代理基本上可以看作“中间人”。这是否意味着HTTPS仍然会受到中间人的攻击呢?请解释。

① 这并不意味着HTTPS就受到了中间人攻击。

② 虽然HTTPS代理在技术上可以看作是一个“中间人”,但是HTTPS受到中间人攻击的关键在于代理服务器是否得到了通信双方的信任,以及它是否按照预期的方式工作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值