教程:Cloud中的加密密钥(使用 Golang 和 CLI)

随着我们越来越多地转向公共云,加密密钥的使用也变得越来越重要。这包括加密数据和数字签名。

1.jpg

随着我们越来越多地转向公共云,加密密钥的使用也变得越来越重要。这包括加密数据和数字签名。它的优势包括:

  • 云中加密。这允许我们在云中加密数据,而不是在客户端机器上处理数据。

  • 访问策略。使用基于云的系统,可以针对加密密钥的使用定义严格的访问策略。

  • 审计。通过AWS CloudTrail,可以记录对加密密钥的访问,这可以支持监管和对合规性的需求。

  • BYOK。这允许用户创建自己的密钥,然后将它们上传到云端。

在AWS中,我们有KMS(密钥管理服务),它生成并存储加密密钥。这些密钥永远不会离开 Amazon 的 HSM(硬件安全模块),并且已根据 FIPS 140–2 进行了验证。导出时,它们仅以加密形式被提供。总的来说,存储一个密钥的费用是每月1美元(但为AWS服务生成的密钥是免费存储的)。密钥的使用不受访问阈值的限制。此外,密钥只能在设置它们的地理区域中使用。

2.jpg

对称或非对称密钥

加密密钥保留在AWS内的一个受信任的硬件环境中,锁定到了特定区域,并应用与AWS IAM(身份和访问管理)标识符相关的严格访问策略。这些与最小特权权限相关——除非在访问策略中定义了权限,否则不会授予权限。

最初,我们可以创建对称密钥(用于加密/解密或生成HMAC)或非对称密钥(用于加密或数字签名)。使用HMAC,我们创建一个对称密钥,该密钥可以用于对消息进行签名,然后使用相同的密钥验证签名。数字签名的话,我们使用一个私人(秘密)密钥对消息进行签名,然后由一个公共密钥进行验证。

在AWS控件中,我们可以使用以下命令创建对称密钥:

3.jpg

生成的密钥有一个key ID,我们定义了它的用途(比如加密和解密):

4.jpg

然后,用户定义密钥别名和ARN (Amazon Resource Names)。接下来,我们可以为密钥的使用定义一个策略:

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::960039751898:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::960039751898:user/bill"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::960039751898:user/bill"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::960039751898:user/bill"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

在本例中,我们会看到只允许用户加密和解密,但不允许其他用户执行这些操作。然后由 Key ID 和 ARN 描述创建的密钥:

5.jpg

现在我们可以编写一个Golang程序,使用这个密钥对明文进行加密,然后进行解密。我们首先需要定义AWS区域和ARN。与此同时,我们还为 AWS_Access_Key_ID 和 AWS_Secret_Access_Key 定义了 AWS 凭证。它们可以在程序中定义,也可以在 ~/.aws/credentials 文件夹 中定义:

package mainimport (
 "fmt""os""github.com/aws/aws-sdk-go/aws"
 "github.com/aws/aws-sdk-go/aws/session"
 "github.com/aws/aws-sdk-go/service/kms"
 "github.com/aws/aws-sdk-go/aws/credentials"
)func main() {message := "This is a secret"
 const keyID = "arn:aws:kms:us-east-1:904269751807:key/9954354-f122-45f9-b6c6-29e571562a22"argCount := len(os.Args[1:])if argCount > 0 {
  message = os.Args[1]
 }creds := credentials.NewStaticCredentials("AWS_Access_Key_ID", "AWS_Secret_Access_Key", "")sess, _ := session.NewSession(&aws.Config{Region: aws.String("us-east-1"), Credentials: creds})svc := kms.New(sess)encMethod := &kms.EncryptInput{KeyId: aws.String(keyID), Plaintext: []byte(message)}cipherText, _:= svc.Encrypt(encMethod)fmt.Printf("Input: %s\n", message)
fmt.Printf("Encrypted: %x\n", cipherText.CiphertextBlob)
inputDecrypt := &kms.DecryptInput{CiphertextBlob: cipherText.CiphertextBlob}
 respDecrypt, _ := svc.Decrypt(inputDecrypt)fmt.Printf("Decrypted: %s\n", string(respDecrypt.Plaintext))
}

一个运行示例:

Input: Testing 12345
Encrypted: 0102020078eba286059ff61e64dc8414c5fc8ff716dda2c8c47903983373a262fcc3a1503a01bfe78037a671257e78e683cd5483b3f00000006b306906092a864886f70d010706a05c305a020100305506092a864886f70d010701301e060960864801650304012e3011040c0516bdc01f1edea632e7fd6102011080282531e65f367891af4ac6c418bf804bbe0bed2e008e30cb93670089c83dc44e7e94950770b8a70488
Decrypted: Testing 12345

AWS CLI加密和解密

除了使用编程语言外,我们还可以使用CLI执行操作。创建密钥:

aws kms create-key --tags TagKey=Purpose, TagValue=MyKey --description "For testing

我们可以从别名中列出我们的密钥:

\> **aws kms list-aliases**
{
    "Aliases": [
        {
            "AliasName": "alias/Test01",
            "AliasArn": "arn:aws:kms:us-east-1:**904269751807**:alias/Test01",
            "TargetKeyId": "9954354-f122-45f9-b6c6-29e571562a22",
            "CreationDate": 1657877917.647,
            "LastUpdatedDate": 1657877917.647
        },

然后,我们可以通过以下方式加密明文消息“Hello 123”:

aws kms encrypt --plaintext hello.txt --key-id="9954354-f122-45f9-b1c3-29e571562a22" --encryption-context purpose=test 
{
    "CiphertextBlob": "AQICAHjrooYFn/YeZNyEFMX8j/cW3aLIxHkDmDNzomL8w6FQOgE+rt03vmCwrYR5fP153zPjAAAAZzBlBgkqhkiG9w0BBwagWDBWAgEAMFEGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMNvsXMqFmyq7j5tMeAgEQgCSrzEA0EJEgrstoNvnbVfH/EaptXzqeOwADaRLMvhDo7F9G6nM=",
    "KeyId": "arn:aws:kms:us-east-1:904269751807:key/9954354-f122-45f9-b6c6-29e571562a22",
    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}

现在可以看到我们有“AQICAH…m4sE=”的密文。接下来,可以进行解密:

aws kms decrypt --ciphertext-blob "AQICAHjrooYFn/YeZNyEFMX8j/cW3aLIxHkDmDNzomL8w6FQOgEnx2HXcpIIObK9qjHFGit3AAAAZzBlBgkqhkiG9w0BBwagWDBWAgEAMFEGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM/qzr60lyQS5A5yZ8AgEQgCQueKSLpCjdQiYHKWPX3NUT87cOvcmrT/RDYlBcDge7Ymzm4sE=" --key-id "9954354-d28-45f9-b1c3-29e571562a22"

非对称密钥和HMAC

使用非对称密钥,我们可以选择RSA 2K、3K或4K:

6.jpg

对于数字签名,我们可以添加P256、P521、sepc256k1的椭圆曲线方法:

7.jpg

结论

网络安全中代价最高的事件之一是信任基础设施遭到破坏。因此,密钥的管理和控制非常重要,将它们存储在云中会带来很多好处。与此同时,我们看到了太多的数据泄露,而加密的使用使得数据泄露的范围可以减少到几乎为零——但我们必须确保我们的密钥得到了安全保存,至少以一种秘密的方式进行了备份。

这些密钥是我们最重要的秘密,所以不要被锁定在一个云提供商上,而且仍然存在有人进入我们的AWS环境并发现我们的密钥的风险。

我在这里创建了一个演示:

https://asecuritysite.com/golang/go_aws

Source:https://medium.com/asecuritysite-when-bob-met-alice/encryption-keys-in-the-cloud-366f091fe90e

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

本文首发于:https://mp.weixin.qq.com/s/xmwlw75XxsJ2Zvfe6JN2jA

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
ChinaDeFi 去中心化金融社区
ChinaDeFi 去中心化金融社区
ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。