# 数据完整性校验

## CloudTrail 日志文件完整性校验

原文地址：[Validating CloudTrail log file integrity](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-log-file-validation-intro.html)

## 使用KMS的Encryption context

### 术语

[Encryption context](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)：所有使用对称加密KMS密钥都有加密上下文，也就是*Encryption context*，这是一组可选的非秘密键值对，可以包含关于数据的额外上下文信息。AWS KMS将加密上下文作为额外的验证数据（AAD）来使用，以支持验证式加密。

### 使用方法

在加密请求中包含一个加密上下文时，它被加密地绑定到密码文本上。当解密和重新加密数据的时候需要相同的加密上下文。如果在解密请求中提供的加密上下文不是精确的、区分大小写的完全匹配，则解密请求失败。只有加密上下文中的键值对的顺序可以变化。

加密上下文不是秘密，也没有加密。它以明文形式出现在 AWS CloudTrail 日志中，因此您可以使用它来识别和归类您的加密操作。您的加密上下文不应包括敏感信息。我们建议你的加密上下文描述被加密或解密的数据。例如，你需要加密Amazon的EBS卷，Amazon EBS所使用的volume ID可以作为加密上下文的取值，如下所示：

```
"encryptionContext": {
  "aws:ebs:id": "vol-abcde12345abc1234"
}
```

您还可以使用加密上下文来细化或限制对账户中AWS KMS密钥的访问。您可以将加密上下文作为授予中的限制条件和策略声明中的条件。

## S3文件的完整性校验

Amazon S3使用校验值来验证您上传到Amazon S3或从Amazon S3下载的数据的完整性。

你上传文件的时候可以选择是否包含校验值作为请求的一部分，Amazon S3会比对你提供的校验值和用算法计算出来的校验值，如果不一致则会产生告警。

{% hint style="info" %}
对于上传的文件进行完整性校验，<mark style="color:red;">**建议选择SHA-256算法**</mark>。因为SHA-256算法具有更高的安全性和更好的抗碰撞性，可以有效地防止数据被篡改或伪造。而CRC32和CRC32C算法主要用于检测数据传输或存储过程中的错误，不太适合用于完整性校验。SHA-1算法已经被证明存在安全漏洞，不建议使用。MD5算法虽然也可以用于完整性校验，但是其安全性较低，容易被攻击者破解。因此，建议选择SHA-256算法进行文件完整性校验。
{% endhint %}

#### 使用校验算法

* Cyclic Redundancy Check (CRC) ： CRC32
  * CRC32是一种循环冗余校验算法，用于检测数据传输或存储过程中的错误。它使用多项式除法和位运算来计算校验和，并将结果附加到数据末尾。CRC32通常用于网络通信、磁盘存储和文件传输等领域。
* Cyclic Redundancy Check (CRC) ： CRC32C
  * CRC32C是CRC32的扩展版本，它支持长数据块的校验。与CRC32不同，CRC32C使用16位多项式进行计算，可以处理更大的数据块。CRC32C通常用于IPv4和IPv6协议中的流量控制和错误检测。
* Secure Hash Algorithms (SHA) ： SHA-1
  * SHA-1是一种哈希函数，用于生成数据的摘要。它使用多项式除法和位运算来计算哈希值，并将结果转换为160位的十六进制数表示。SHA-1通常用于数字签名、消息认证码和数据完整性验证等领域。
* Secure Hash Algorithms (SHA) ： SHA-256
  * SHA-256是SHA-1的升级版，它使用更复杂的算法和更多的处理器指令来提高计算速度和安全性。SHA-256通常用于加密、数字签名和安全哈希等领域。与SHA-1相比，SHA-256具有更高的安全性和更好的抗碰撞性。

#### 使用Content-MD5

另一种验证你的对象在上传后的完整性的方法是在你上传时提供对象的MD5摘要。如果你为你的对象计算了MD5摘要，你可以通过使用Content-MD5头在PUT命令中提供该摘要。

提供MD5摘要不是必须的，但你可以用它来验证对象的完整性，作为上传过程的一部分。

#### 使用ETag <a href="#checking-object-integrity-etag-and-md5" id="checking-object-integrity-etag-and-md5"></a>

一个对象的实体标签entity tag（ETag）代表该对象的一个特定版本。请记住，ETag只反映一个对象的内容的变化，而不是它的元数据。如果只有一个对象的元数据发生了变化，ETag保持不变。

基于不同的对象加密方式，对象的ETag可能是其MD5摘要，也可能不是。你可以将对象的ETag值与计算的或先前存储的Content-MD5摘要进行比较。作用类似于MD5摘要，都可以作为上传的一部分用来验证对象的完整性。

## 参考资料

\[Blog] [How to Protect the Integrity of Your Encrypted Data by Using AWS Key Management Service and EncryptionContext](https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)

\[docs] [Checking object integrity](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html)

\[Hands-on] [Tutorial: Checking the integrity of data in Amazon S3 with additional checksums](http://aws.amazon.com/getting-started/hands-on/amazon-s3-with-additional-checksums/?ref=docs_gateway/amazons3/checking-object-integrity.html)
