问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

网络安全基础技术扫盲篇 — 名词解释之“完整性“

创作时间:
作者:
@小白创作中心

网络安全基础技术扫盲篇 — 名词解释之“完整性“

引用
CSDN
1.
https://m.blog.csdn.net/weixin_39266374/article/details/139230229

在网络安全领域,"完整性"是一个核心概念,它确保数据在传输、存储和处理过程中不被未经授权的修改、删除或损坏。本文将从理论到实践,深入探讨数据完整性的实现方法和应用场景。

完整性的定义与重要性

在网络安全中,完整性是指确保数据在传输、存储、处理等过程中不被未经授权的修改、删除或损坏,保持数据的完整和可信性。完整性是信息安全的一项重要特性,确保数据的准确性和可靠性,防止数据被篡改或破坏。

完整性常见实现方式:

  1. 哈希函数(Hash Function):使用哈希函数对数据进行计算,生成固定长度的哈希值。在传输过程中,接收方可以再次计算接收到的数据的哈希值,并与发送方传输的哈希值进行比对,如果一致则说明数据没有被篡改,保证了数据的完整性。

  2. 数字签名(Digital Signature):数字签名使用公钥密码学算法来对数据进行加密和签名,确保数据的完整性和身份认证。发送方使用私钥生成数字签名,附加在数据中,接收方使用发送方的公钥验证数字签名的正确性,如果验证通过,则说明数据没有被篡改。

数据传输过程中的完整性保护

SSL/TLS协议的工作原理

SSL(Secure Sockets Layer)或其继任者TLS(Transport Layer Security)协议是保证数据传输过程中完整性的重要手段。以下是HTTPS建立安全连接的过程:

  1. 客户向服务端发送一个通信请求
  • 客户->服务器 :你好
  1. 服务器向客户发送自己的数字证书。证书中有一个公钥用来加密信息,私钥由服务器持有
  • 服务器->客户:你好,我是服务器,这是我的数字证书
  1. 客户收到服务器的证书后,它会去验证这个数字证书到底是不是服务器的,数字证书有没有什么问题,数字证书如果检查没有问题,就说明数字证书中的公钥确实是服务器的。检查数字证书后,客户会发送一个随机的字符串给服务器用私钥去加密,服务器把加密的结果返回给客户客户用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是服务器
  • 客户->服务器:向我证明你就是服务器,这是一个随机字符串。
  • 服务器->客户:{一个随机字符串}[私钥|RSA]
  • 客户用公钥解密随机字符串
  1. 验证服务器的身份后,客户生成一个对称加密算法和密钥,用于后面通信的加密和解密。这个堆成加密算法和密钥,客户会用公钥加密后发给服务器,别人截获了也没用,因为只有服务器手中有可以解密的私钥。这样,后面服务器客户就都可以用对称加密算法来加密和解密通信内容了。
  • 客户->服务器:{对称加密算法和密钥}[公钥|RSA]
  • 服务器->客户:{OK,已经收到你发来的对称加密算法和密钥!有什么可以帮到你的?}[密钥|对称加密算法]
  • 客户->服务器:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[密钥|对称加密算法]
  • 服务器->客户:{你好,你的余额是100元}[密钥|对称加密算法]
  • //继续其他通信

SSL/TLS协议的增强措施

  1. 防止私钥滥用:为了避免黑客通过发送简单有规律的字符串来寻找加密规律,服务器在收到客户发送的加密字符串时,不是直接加密该字符串,而是先对其进行哈希计算,然后加密哈希值。客户收到加密的哈希值后,可以自行计算字符串的哈希值并与之对比,从而确认对方是否是真正的服务器。

  2. 防止重复攻击:为了避免黑客通过重复发送截获的消息来扰乱通信过程,可以在通信内容中添加序号或随机值。如果接收方发现重复的序号或随机值,会立即停止通信。

  3. 防止数据篡改:为了避免黑客在通信过程中修改密文,可以在每次发送信息时,先对信息内容进行哈希计算得出一个哈希值,将信息内容和这个哈希值一起加密后发送。接收方在收到后进行解密,得到明文内容和哈希值,然后自行对收到的信息内容进行哈希计算,与收到的哈希值进行对比,如果不匹配说明中途有人故意对加密数据进行了修改,应立即中断通话过程并进行其他处理。

常见采用SSL的通信协议

  • HTTPS(HTTP Secure):HTTPS是HTTP协议的安全版本,通过使用SSL/TLS协议对HTTP通信进行加密和身份验证,保证数据在传输过程中的机密性和完整性。HTTPS通常用于安全的Web浏览器和服务器之间的通信,如网上银行、电子商务等。

  • SMTPS(SMTP Secure):SMTPS是SMTP协议的安全版本,通过使用SSL/TLS协议对电子邮件的传输进行加密和身份验证,防止邮件被窃听和篡改。SMTPS通常用于安全的电子邮件传输。

  • POP3S(POP3 Secure):POP3S是POP3协议的安全版本,通过使用SSL/TLS协议对电子邮件的接收进行加密和身份验证,确保邮件在传输过程中的安全性和完整性。POP3S通常用于安全的电子邮件接收。

  • FTPS(FTP Secure):FTPS是FTP协议的安全版本,通过使用SSL/TLS协议对文件传输进行加密和身份验证,确保文件在传输过程中的安全性和完整性。FTPS通常用于安全的文件传输。

  • SSH(Secure Shell):SSH是一种通过加密和身份验证来保证安全通信的网络协议。它通过在不安全的网络上提供一个安全的通信渠道,防止数据被窃听、篡改和伪造。SSH协议可以使用公钥加密和对称密钥加密来保证数据的机密性,并通过MAC算法对数据的完整性进行校验。通过SSH协议,用户可以远程登录到其他计算机上,并进行安全的文件传输、命令执行等操作。SSH协议是一种常用的安全远程管理工具,被广泛应用于服务器管理、远程维护和安全通信等领域。

使用哈希算法验证数据完整性

使用哈希函数(如MD5、SHA-256等)计算数据的哈希值,并将哈希值附加在数据上。在接收数据的一方,使用相同的哈希函数计算接收到的数据的哈希值,并与附加的哈希值进行比对,如果不一致则说明数据可能被篡改。

示例

假设我们要使用校验和验证机制来保证数据传输过程中的完整性,以及使用SHA-256哈希函数进行哈希值验证:

  1. 发送方操作配置
  • 在发送方,假设我们有一个名为test.txt的文件需要传输。
  • 使用校验和工具(如md5sum on Linux系统)计算文件的校验和,生成一个校验和值。
  • 将校验和值附加在数据文件中。
    示例命令(在Linux环境下):
    md5sum test.txt
    
  1. 接收方操作配置
  • 在接收方,接收到传输来的test.txt文件。
  • 使用校验和工具(CertUtil)计算接收到的文件的校验和。
  • 将计算得到的校验和值与附加在数据文件中的校验和值进行比对,如果一致,则数据的完整性得到保证;如果不一致,则可能发生数据篡改。
    示例命令(在Windows环境下):
    certutil -hashfile 文件路径 MD5
    
    发现MD5一致,那么此时,我们修改test.txt文件,例如仅在文末添加一个。可以发现其MD5值产生了天翻地覆的变化。
  1. 哈希值验证操作配置
    使用方法与上述一致,仅需要调整使用的哈希函数。

使用数字签名验证数据完整性

  • 发送方使用私钥生成数字签名,将签名附加在数据上。
  • 接收方使用发送方的公钥验证数字签名的正确性,并使用相应的算法对数据的完整性进行验证。

实验步骤

  1. 生成公私钥文件

    openssl genpkey -algorithm RSA -out private.key
    

    执行命令后,私钥文件private.key将被生成。

    从私钥文件中导出公钥文件:

    openssl pkey -in private.key -pubout -out public.key
    

    执行命令后,公钥文件public.key将被生成。

  2. 生成数字签名
    使用私钥和相应的数字签名算法(如RSA、DSA等),对待签名文件进行签名。假设私钥文件为private.key,待签名文件为data.txt,签名结果为signature.txt。
    使用命令行工具(如OpenSSL)执行以下命令进行数字签名生成:

    openssl dgst -sign private.key -sha256 -out signature.txt data.txt
    

    执行命令后,会使用私钥对data.txt文件进行数字签名,生成签名结果保存为signature.txt 文件,这个文件将用于验证文件完整性。

  3. 验证文件完整性
    使用公钥和相同的数字签名算法(如RSA、DSA等),对待验证文件和相应的数字签名进行验证。
    使用命令行工具(如OpenSSL)执行以下命令进行数字签名验证:

    openssl dgst -verify public.key -sha256 -signature signature.txt data.txt
    

    执行命令后,会使用公钥对signature.txt文件进行数字签名验证,如果验证通过,则表示文件的完整性得到了保证。
    如果我们修改data.txt数据,例如和之前一样,给他加个.,此时文件的完整性就受到了破坏,提示验证失败。其实就是在数据传输过程中,通过将原来的文件进行签名,再与你接受到的文件进行签名比对,来确定完整性是否收到破坏。

存储过程中的完整性保护

存储过程中的完整性保护主要是确保数据在存储到计算机上后,不会因为误操作或其他原因被篡改。这里可以先看一下以前客户现场的一张截图,下面有期望版本与当前版本两列。判断存储数据是否被篡改,其实就是需要一个比对过程,一般采用哈希算法进行完整性比对。哈希值的特点就是原数据改变(即使在一串字符中加入了一个1),所计算出来的哈希值也会有天差地别。所以要求是要有比对的手段,来判断其是否具有存储完整性校验措施,而与数据存储采用的算法无关,比如鉴别数据采用MD5,但是没有比对过程,是与等保要求的完整性校验没有任何关系的。

能力验证官方给的答案也是要求需要这类完整性校验工具去实现。具体的可看等保2.0测评深入理解—Linux操作系统(十)与 2022能力验证—linux系统配置核查(四)中介绍了Linux系统中常用的两款完整性校验工具。

所以类比数据库,对于存储数据中的哈希值的完整性,算法本身并不能提供保护,无法验证哈希值的完整性或检测其是否被篡改。假设上图的adminpass字段,我故意篡改了数据,此时你并不知道表内数据被人改了,同时应用系统死活登不上了,你还以为是自己密码输错了。为了防止这种情况发生,在数据库中存储数据的同时,还存储与数据相关联的哈希值。使用哈希算法对原有的数据进行计算,并将计算后的哈希值与数据一起存储在数据库中,在获取数据时验证其完整性是否遭受到篡改。

假设有这么一张数据表,password 字段存放的是用户口令的MD5值,password_hash 字段存放的是password 字段的MD5值(用于做完整性校验)

正常情况下,我们使用下列语句进行查询,可以发是否存在篡改项

SELECT t1.* FROM users t1 INNER JOIN (SELECT password, password_hash FROM users WHERE password_hash <> MD5(password)) t2 ON t1.password = t2.password;

具体解释如下:

  1. SELECT t1.*:这个语句表示我们要选择原始表的所有列。即查询结果将会返回被篡改的行的所有列数据。

  2. FROM 表名 t1:这里的 表名 是你要查询的数据表的名称,t1 是此表的别名,用于在查询过程中引用这个表。

  3. 子查询部分 (SELECT password, password_hash FROM 表名 WHERE password_hash <> MD5(password)) t2:在这个子查询中,我们选择了表中的密码和密码哈希值列,并筛选出密码哈希值与通过MD5哈希算法计算得到的哈希值不匹配的行。通过将这个子查询的结果与原始表进行连接,我们可以找到被篡改密码的行。

  4. ON t1.password = t2.password:这个条件指定了连接两个表的方式,通过比较两个表中的密码列来进行连接。只有当两个表中的密码匹配时,才会返回对应的行。

  5. 最终查询结果将会是原始表中密码哈希值与计算得到的MD5哈希值不匹配的行,即被篡改的行。

例如现在们在admin用户的password字段开头数字2改成3,此时再用该语句检查,就发现该行的完整性受到了破坏,我们就能发现哪行数据被篡改了。

以上的完整性相关实验,仅用于帮助理解“完整性”概念,如果发现存在有问题的点,欢迎大家留言讨论。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号