第3章 密码技术应用 密码学是消息加密、身份认证、完整性检验等网络安全技术的理论基础,也是网络通信 安全的重要支撑。本章将介绍系统安全访问与口令破解、公钥基础设施(PublicKey Infrastructure,PKI)、完善保密协议(PrettyGoodPrivacy,PGP)等加密与身份认证技术, 带领读者了解密码学在网络安全的应用。 基于口令的认证技术,是基于密码技术的典型应用。口令的选取、注册存储与验证是基 于口令认证技术的关键。弱口令往往是系统安全的最短板,口令破解则是攻击者最常用的 技术手段。PKI则用于网络通信中的身份认证的实现,其核心技术双钥密码使网络中的通 信双方无须协商密钥即可进行加密的信息交换。PKI将用户身份与其公钥绑定,使公钥所 有者的身份可信,提供身份认证、数据完整性、数据保密性等安全服务,因而被广泛地应用于 安全浏览器、电子数据交换、安全电子邮件中。PGP则是使用多种密码学技术实现的一套 用于消息加密与消息验证的应用程序,在安全电子邮件、安全Web应用中提供消息机密性 和来源认证服务。与PKI不同,PGP支持通过信任网络分布式地实现公钥信赖管理。 通过本章的实验,读者将掌握口令破解、PKI以及PGP的基本原理与工具使用方法。 3.1 口令破解 3.1.1 实验目的 熟悉Linux系统的安全访问机制,了解典型账号口令破解技术的基本原理、常用方法及 相关工具,掌握防范此类攻击的方法及措施。 3.1.2 实验内容 查看Linux系统账户信息文件,了解其安全访问机制,利用JohntheRipper软件破解 账户口令,了解字典攻击的原理及不足。 3.1.3 实验原理 1. Linux 中的口令存储 Linux是一个多用户多任务的分时操作系统,允许多个用户共享使用同一台计算机资 源。用户的账号在该机制下,一方面,可以帮助用户组织文件,保障安全性;另一方面,可以 帮助系统管理员对当前使用计算机的用户进行跟踪,控制它们访问系统资源的权限。通常, 系统将所有用户的账户信息存储在公共文件/etc/passwd中。该文件中每一行代表一个账 户,不同域使用冒号(:)隔开,代表不同信息,各域的含义如图3-1所示,读者可以通过man 第3章密码技术应用 5paswd命令查看各个域的具体含义。 图3-1paswd文件各域信息 .账户名是代表用户账号的字符串,其长度通常不超过8个字符。 .口令只存放一个特殊的字符,如“x”或“*”,真正加密后的用户口令存放在/etc/ shadow文件中。 .用户标识(id)是一个整数,是用户在系统中的唯一标识号,通常情况下用户标识与 账户名一应。当多个账户名对应同一用户标识的情况出现时,尽管它们可以有 不同的口令、主目录等,系统会将它们视作同一个用户。0是超级用户root的标识, 1~99由系统保留作为管理账号,普通用户的标识号从100开始。一对(u) .组标识(gid)是用户所属用户组的标识号,对应着/etc/group文件中的一条记录。 .账户注释记录用户的个人信息,包括用户的真实姓名、电话与地址等。 .默认工作目录是当前用户的起始工作目录。在Linux系统中,所有用户的工作目录 都被组织在一个特定的目录下,且目录的名称与用户的账户名称对应。各用户对自 己的工作目录有读、写、执行的权限。 . 登录后的启动程序是用户登录到系统后运行的命令解释器或某个特定程序,即 shenuheascskstcs l 。Lix默认的sl 是bh,此外还有sh,h,h,h等。 如上文所述,账户口令信息存储在受保护文件/etc/shadow中,非root用户无法打开。 同样,该文件中每一行代表一个账户,与/etc/paswd文件中的账户一一对应。每一行的不 同域使用冒号隔开,代表不同信息,各域的含义如图3-2所示,其中,口令时间相关信息包括 口令最后被修改的时间、修改口令的最小期限、修改口令的最大期限、口令过期提醒时间、口 令过期失效时间、账户过期时间等,可以通过man5shadow命令查看各个域的具体含义。 图3-2shadow文件各域信息 从shadow文件内容中可以看出,账户的口令并不以明文形式存储。Linux系统存储的 是口令加盐之后的哈希值,其口令信息的格式为$ih,其中,d代表不同的哈希 d$salt$hasi 37 网络安全创新实验教程(微课版) 方式,包括$1$ == md5,$5$ ==sha256,$6$ ==sha512等。 2. 口令破解攻击 通常,对于口令的破解攻击方法包括穷举攻击、字典攻击、混合攻击等,其中,穷举攻击 穷举所有可能的口令组合,加密每个组合,并将已知的密文与加密结果进行比对,试图找到 已知密文对应的明文;字典攻击是从字典文件(也称彩虹表)中寻找可能的口令;而混合攻击 则是结合上述两种猜测方式进行攻击。常见的口令破解工具包括Cain,JohntheRipper, Pandora,LC5等。 JohntheRipper软件是一个快速的口令破解工具,用于在已知密文的情况下尝试破解 出明文。它支持破解目前大多数的加密算法,如DES,MD4,MD5等。它有3种破解模式, 包括字典破解(Wordlistcrack)模式、简单破解(Singlecrack)模式、增强破解(Incremental) 模式。 (1)字典破解模式 JohntheRipper实施字典攻击的模式,将字典文件与亟待破解的密码文件作为参数。 字典模式还可以施加单词变化规则(Wordmanglingrules)———通过将其应用于单词列表文 件中的每一行,使每个源单词衍生多个候选密码(如字母大小写变换),以增加破解概率。 (2)简单破解模式 JohntheRipper将用户账户名、主目录名称等信息,以及其应用变换规则后得到的大 量衍生字符串作为候选密码实施破解工作,该模式下破解速度最快。 (3)增强破解模式 JohntheRipper尝试所有可能的密码组合,是最具威力的破解模式。然而尝试所有的 字元组合,因此破解时间十分冗长。 JohntheRipper的命令行工具john,具体参数选项如表3-1所示。 表3-1 JohntheRipper命令行工具的参数及含义 参 数含 义 -single 使用简单破解模式 -wordlist=FILE-stdin 字典模式,从FILE或标准输入中读取词汇 -rules 应用单词变换规则 -incremental[=MODE] 使用增强破解模式 -show 现实已破解的口令 -test 执行破解速度测试 3.1.4 实验步骤 本次实验继续在配置好的虚拟环境中操作。安装实验所需软件: $sudo apt-get install john locate 其中,john用于进行口令破解实验,locate用于查找指定文件名的文件。请在虚拟机~/目 录下创建password目录: $mkdir password/ 38 第3章 密码技术应用 $cd password 1. 添加用户 按表3-2添加用户并设定口令。 表3-2 实验添加用户名及口令 用 户 名口 令 User1 Hello User2 123 User3 Flower User4 Dragon 用 户 名口 令 User5 Hellodragon User6 123Hello User1 Hello 添加用户账号并设定口令的命令如下: // 添加用户账号 $sudo useradd [Username] // 设定用户账户口令 $sudo passwd [Username] // 根据提示输入口令 // 根据提示再次输入口令确认 // 请注意,两次输入口令都不会在屏幕上显示 任务3.1 添加所有用户后,请利用以下命令查看口令文件内容与权限,截图记录查看结果。 $cat /etc/passwd $sudo cat /etc/shadow $ls -l /etc/passwd $ls -l /etc/shadow 2. 利用John the Ripper 软件破解口令 组合口令文件: $sudo unshadow /etc/passwd /etc/shadow >test_shadow 查找字典表文件的路径: $sudo updatedb $sudo locate password.lst 运行JohntheRipper软件破解刚刚创建的口令文件,其中,[list_path]为之前找到的字 典表文件路径: $john --wordlist=[list_path]test_shadow 运行过程中,按空格键可以查看运行进程,按Ctrl+C键停止进程。完成后,查看破解 结果: $john --show test_shadow 任务3.2 按以上步骤完成实验,截图记录实验过程,观察并解释破解结果。 39 网络安全创新实验教程(微课版) 3. 增强John the Ripper 软件口令破解能力 在图形界面查看字典表文件,按Ctrl+F键查找单词,发现该文件存在单词flower,但 不存在单词Flower。在运行JohntheRipper软件时,可以利用-rules参数应用单词变化规 则尝试字典文件中单词的其他可能。 任务3.3 利用-rules参数再次破解口令文件,截图记录运行命令与破解结果,并回答: 这次破解的运行时间如何? 为什么运行时间出现这样的变化? 3.2 公钥基础设施 3.2.1 实验目的 熟悉PKI的基本组成,及其解决的安全问题;了解CA 在PKI中的作用以及其签发证 书的流程;了解数字证书的用途和X.509数字证书格式。 3.2.2 实验内容 在实验中实现建立CA 以及CA 签发证书过程,查看生成的证书,了解数字证书的构 成;并将证书用于HTTPSWeb服务器,了解浏览器验证网站证书的过程。 3.2.3 实验原理 1. 中间人攻击 公钥加密是现代加密通信的基础,但是它在公钥共享阶段很容易受到中间人(Man-inthe- Middle,MITM)攻击。中间人攻击发生在两个设备的通信中,攻击者与受害者建立单 独的通信,并在受害者之间传递消息。受害者认为他们正在与对方进行秘密通信,而实际上 整个通信均由攻击者控制。图3-3展示了一个典型的中间人攻击场景,其中,Mallory是攻 击者,他能够截获Alice以及Bob的通信,实行中间人攻击的步骤如下: 图3-3 中间人攻击示意图 . Mallory截获Alice送出的公钥,并将自己的公钥转发给Bob。 . Bob认为接收到的公钥是Alice的,利用接收到的公钥加密一条消息并发出。 . Mallory截获Bob发出的秘密消息,由于该消息使用Mallory自己的公钥加密,因此 Mallory可以解密该消息,得知消息内容,并用Alice的公钥再次加密后转发给 Alice。 . Alice可以解密收到的消息,得知消息内容。 40 第3章 密码技术应用 如果这个攻击发生在秘密通信信道建立前双方协商密钥的阶段,那么该场景中的消息 就是秘密信道的密钥。因此,Mallory就可以利用获取到的密钥,解密Alice与Bob之间的 所有通信消息。 从上述的攻击场景可以发现,中间人攻击能够成功的原因是,当Bob收到一份声称来 自Alice的公钥时,他不能判断这个公钥究竟属于谁。因此,要抵御中间人攻击,需要对收 到的公钥进行身份认证。 2. 公钥基础设施 PKI是一种用公钥密码理论和技术实施和提供安全服务,具有普适性的安全基础设施。 在实际应用中,PKI将用户身份与其公钥结合,其核心组件是证书机构(Certificate Authority,CA)。CA 负责验证用户的身份,并签发对应数字证书。数字证书则是证明证 书中公钥所有权的文件,由已经验证该公钥所有权的CA 签发,因此,数字证书的安全性基 图3-4 证书签发与验证流程 于对CA 的信任。 基于PKI/CA 实现的证书签发以及验证 过程如图3-4所示。 (1)证书签发。 ① 用户Alice向CA 机构提交个人信息、 注册密钥信息。 ② CA 机构验证与审核用户Alice的身 份,将其密钥对的公钥、个人信息经过自身私 钥加密后封装成一张数字证书。 ③ 将生成的数字证书签发给用户Alice。 (2)证书验证。 ① 用户Alice将数字证书发送给Bob。 ② 用户Bob使用CA 的公钥检测证书有效性。 ③ 如Bob证书有效,则Alice后续可用Bob公钥加密与其通信的信息。 3. X.509 数字证书 数字证书一般包括公钥、拥有者的身份标识以及可信实体的签名。接收者可以通过验 证签名来保证证书的完整性。验证成功后,接收者将会确定公钥的拥有者。X.509标准规 定了数字证书的格式,主要包括: .Issuer 该域包含签发该证书的CA 信息。 .Subject 该域包含证书中公钥的拥有者信息。 . Publickey 该域包含公钥信息,包括公钥算法以及具体公钥等。 .Signature 该域包含签发者(Issuer)的数字签名信息,包括签名算法以及具体签 名等。 . Validity 该域包含该数字证书的有效期。 .Serialnumber 每个证书都有一个独特的序列号,用于与其他证书区分。 . Extensions 更新版本的X.509证书包含可选的扩展域。 41 网络安全创新实验教程(微课版) 3.2.4 实验步骤 安装实验所需软件: $sudo apt-get install apache2 其中,apache2用于搭建Web服务器。 将实验所需文件压缩包PKI.tar.gz放入虚拟机~/目录下并解压,进入该目录。 公钥加密是现代加密通信的基础,但是它在共享密钥阶段很容易受到中间人攻击。在 实际应用中,PKI利用CA 将用户身份与其公钥结合,利用数字证书解决公钥的可信性问 题。CA 是一个签发电子证书的可信实体,本实验将建立一个根CA,并为一个网站签发 证书。 1. 建立CA 将openssl提供的配置文件/usr/lib/ssl/openssl.cnf复制到PKI目录,按以下形式修改 配置文件中的[CA_default]一节,并根据要求创建相应文件夹或文件: dir =./myCA #文件夹,存储所有文件 certs =$dir/certs #文件夹,存储签发证书 crl_dir =$dir/crl #文件夹,存储证书吊销列表 new_certs_dir =$dir/newcerts #文件夹,存储新证书 database =$dir/index.txt #文件,数据库索引文件 serial =$dir/serial #文件,存储当前序列号 其中,对于index.txt文件,只须创建一个空文件;对于serial文件,创建文件后需要输入序 列号,以文件形式输入的序列号应为偶数位数的十六进制数字,如1000,0a等。 在PKI目录下,利用opensslreq命令为CA 生成一个自签名证书,该证书证明CA 可 信,并成为根证书: $openssl req -new -x509 -config openssl.cnf -keyout ca.key -out ca.crt 其中,参数的具体含义如表3-3所示。 表3-3 opensslreq命令相关参数与含义 参 数含 义 -new 创建一个证书请求文件,若之后指定了-x509选项,代表创建自签名证书文件 -keyout[file] 指定自动创建私钥时私钥的输出文件 -out[file] 指定证书请求或自签名证书的输出文件 -config[file] 指定req命令的配置文件 在证书生成过程中,需要输入口令(passphrase)与相关信息。请使用简便易记的口令 并牢记,因为该CA 在每次签发证书时都会要求输入口令。另外,还需要输入一些相关信 息,例如CountryName,CommonName等,可以自行输入,也可以按Enter键使用默认 值。输出文件包括ca.key与ca.crt。具体的CA 建立流程演示,可参考本书附带的微课 视频。 42 创建自己 的CA 第3章 密码技术应用 任务3.4 在实验报告中截图展示这两个文件,写明两个文件分别存储什么内容,并回 答:证书中的Issuer与Subject分别代表什么? 为什么ca.crt文件中这两个域的数据相同? 注:除了在图形化界面直接查看证书信息外,也可以使用以下命令在命令行查看证书 信息: $openssl x509 -in ca.crt -text -noout 2. 利用CA 签发证书 假设有一个网站PKI.com,需要从CA 处取得一个电子证书,可以通过以下步骤完成签 发流程。 首先,PKI.com 需要生成自己的公私钥对: $openssl genrsa -aes128 -out server.key 2048 该命令将生成一对2048比特的RSA 公私钥对,同时将私钥用AES128加密,并存储在 server.key文件中。在生成时,用户需要输入私钥加密所用的口令,同样地,请使用简便易 记的口令并牢记。可以使用以下命令在命令行查看密钥信息(需要输入私钥加密口令): $openssl rsa -in server.key -text 其次,PKI.com 需要生成证书请求文件(CSR)。该文件包含PKI.com 的公钥,并会被 发送给CA,请求CA 对公钥进行签名: $openssl req -new -config openssl.cnf -key server.key -out server.csr 在生成证书请求文件时,可在CommonName域输入“PKI.com”;对于extra中的 attributes域,可自行输入,或直接按Enter键使用默认值;对于其他域,应与CA 保持一致。 最后,CA 收到证书请求文件(server.csr)后,利用自己的私钥(ca.key)与证书(ca.crt), 签名并生成PKI.com 所需的X.509证书(server.crt),使用的命令如下所示: $openssl ca -config openssl.cnf -in server.csr \ -keyfile ca.key -cert ca.crt \ -out server.crt 任务3.5:在实验报告中截图展示所有生成文件(server.key,server.csr,server.crt),并指 明它们的关系。 3. 验证CA 签发证书的签名 查看PKI.com 证书(server.crt)的相关信息: $openssl x509 -in server.crt -text -noout 可以看到证书文件分为3部分,Data域、SignatureAlgorithm 域与SignatureValue域。其 中,Data域为证书的基本信息部分,也称为TBSCertificate(To-Be-SignedCertificate);而 SignatureAlgorithm域是CA使用的签名算法;SignatureValue域是CA利用指定签名算法对 TBSCertificate哈希值的签名结果。例如,若签名算法为sha256WithRSAEncryption,则表示 CA计算TBSCertificate的SHA256哈希值,并使用RSA算法对该哈希值进行签名。 43 网络安全创新实验教程(微课版) 寻找证书中TBSCertificate的位置: $openssl x509 -in server.crt -inform pem -outform pem -out server.pem // 以ASN.1 格式解析PEM 文件 $openssl asn1parse -i -in server.pem 该命令的输出如图3-5所示。根据ASN.1标准的定义,第2行(图3-5中的方框)表示 TBSCertificate在PEM 文件中的偏移量(offset)为4,总长度为642(头长度为4,主体长度 为638)。 图3-5 证书ASN.1解析结果 根据解析的信息提取TBSCertificate,保存为server.tbs文件,并计算该文件的哈希值 (哈希算法以证书指定版本为准,此处以SHA256算法为例): $openssl asn1parse -in server.pem -strparse 4 -out server.tbs $sha256sum server.tbs 任务3.6 从server.crt中提取该证书的签名,从ca.crt中提取CA 的公钥(Exponent 与Modulus),填入实验给定的Python代码中,并补充代码文件,使其完成利用CA 公钥对 该签名的验证过程,即对比Python程序输出与上述计算的哈希值。 注: (1)在Python中,可以用pow(x,y,z)计算xymodz。 (2)Python程序的输出由3部分组成,分别为RSA 算法的填充(“1fff…”),ASN.1 SHA256算法指定前缀(“3031300d060960864801650304020105000420”)与哈希值。 4. 将证书用于HTTPS Web 服务器 CA 签发的证书可以用于建立HTTPS连接。本实验将利用openssl为PKI.com 网站 建立一个简单的HTTPSWeb服务端。 首先,配置DNS服务。为了让虚拟机能够解析该域名,需要将以下字段填入虚拟机/etc/ hosts文件中;该字段将主机域名PKI.com映射到虚拟机本地机(127.0.0.1为回送地址)。 127.0.0.1 PKI.com 然后,基于之前生成的证书,使用openssls_server命令建立一个简单的Web服 务器。 // 将密钥与证书合成为一个文件 44 第3章 密码技术应用 $cp server.key server.pem $cat server.crt >>server.pem // 利用server.pem 建立一个Web 服务器 $openssl s_server -www -cert server.pem // 使用CTRL+C 键可以关闭该服务器进程 openssls_server命令建立的服务器默认监听4433端口,因此,可以通过以下URL访 问该服务器:https://PKI.com:4433/。 任务3.7 访问设立的Web服务器,截图记录访问结果,描述观察到的情况,并解释 原因。注 :此时浏览器应出现报警页面,如图3-6所示。可以单击“Advanced...”按钮查看报 警信息,但不要单击Advanced之后弹出页面上的“AccepttheRiskandContinue”按钮。 图3-6 浏览器报警页面 任务3.8 为了能够顺利访问Web服务器,需要在Firefox的CA 列表中加入之前建立 的CA 证书,添加方式参考附录G。再次访问Web服务器https://PKI.com:4433/,截图展 示并描述观察到的情况(注意地址栏的图标)。 任务3.9 本实验在设置域名解析时,将https://PKI.com:4433/指向本地机,若访问 https://localhost:4433/,会出现什么情况? 截图展示访问情况与报警信息,并解释原因。 5. 建立基于Apache 的HTTPS 网站 利用Apache服务建立一个HTTPS网站,需要修改Apache配置文件,指定网站文件 以及网站密钥与证书的存储位置。例如,要建立一个名为example.com 的网站,需要在 /var/www文件夹中新建一个名为example的文件夹,在其中新建一个名为index_https. html的文件,并填入以下内容(对于熟悉HTML的读者,也可以自行编写一个简单的网页 文件):
This is the page from HTTPS server.
45 网络安全创新实验教程(微课版) 利用以下命令修改/etc/apache2/sites-available/default-ssl.conf文件: