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

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

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

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

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

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

常见实现方式

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

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

数据传输过程中的完整性

SSL/TLS协议的工作原理

SSL/TLS协议使用加密和身份验证机制来确保数据的安全和完整性。以下是HTTPS建立安全连接的过程:

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

SSL/TLS协议的安全机制

  1. 防止黑客加密有规律的字符串
  • 服务器并不是真正的加密这个字符串本身,而是把字符串进行一个hash计算,加密这个字符串的hash值(不加密原来的字符串)后发送给客户客户收到后解密这个hash值并自己计算字符串的hash值然后进行对比是否一致。也就是说服务器不直接加密收到的字符串,而是加密这个字符串的hash值,这样就避免了加密那些有规律的字符串,从而降低被破解的几率。
  1. 防止重复发送信息
  • 可以给通信的内容加上一个序号或者一个随机的值,如果客户或者服务器接收到的信息中有之前出现过的序号或者随机值,那么说明有人在通信过程中重发信息内容进行捣乱,双方会立刻停止通信。
  1. 防止密文被修改
  • 在每次发送信息时,先对信息的内容进行一个hash计算得出一个hash值,将信息的内容和这个hash值一起加密后发送。接收方在收到后进行解密得到明文的内容和hash值,然后接收方再自己对收到信息内容做一次hash计算,与收到的hash值进行对比看是否匹配,如果匹配就说明信息在传输过程中没有被修改过。如果不匹配说明中途有人故意对加密数据进行了修改,立刻中断通话过程后做其它处理。

常见采用SSL的通信协议

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

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

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

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

  5. 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号