随着我们越来越多地转向公共云,加密密钥的使用也变得越来越重要。这包括加密数据和数字签名。
随着我们越来越多地转向公共云,加密密钥的使用也变得越来越重要。这包括加密数据和数字签名。它的优势包括:
云中加密。这允许我们在云中加密数据,而不是在客户端机器上处理数据。
访问策略。使用基于云的系统,可以针对加密密钥的使用定义严格的访问策略。
审计。通过AWS CloudTrail,可以记录对加密密钥的访问,这可以支持监管和对合规性的需求。
BYOK。这允许用户创建自己的密钥,然后将它们上传到云端。
在AWS中,我们有KMS(密钥管理服务),它生成并存储加密密钥。这些密钥永远不会离开 Amazon 的 HSM(硬件安全模块),并且已根据 FIPS 140–2 进行了验证。导出时,它们仅以加密形式被提供。总的来说,存储一个密钥的费用是每月1美元(但为AWS服务生成的密钥是免费存储的)。密钥的使用不受访问阈值的限制。此外,密钥只能在设置它们的地理区域中使用。
加密密钥保留在AWS内的一个受信任的硬件环境中,锁定到了特定区域,并应用与AWS IAM(身份和访问管理)标识符相关的严格访问策略。这些与最小特权权限相关——除非在访问策略中定义了权限,否则不会授予权限。
最初,我们可以创建对称密钥(用于加密/解密或生成HMAC)或非对称密钥(用于加密或数字签名)。使用HMAC,我们创建一个对称密钥,该密钥可以用于对消息进行签名,然后使用相同的密钥验证签名。数字签名的话,我们使用一个私人(秘密)密钥对消息进行签名,然后由一个公共密钥进行验证。
在AWS控件中,我们可以使用以下命令创建对称密钥:
生成的密钥有一个key ID,我们定义了它的用途(比如加密和解密):
然后,用户定义密钥别名和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 描述创建的密钥:
现在我们可以编写一个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
除了使用编程语言外,我们还可以使用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"
使用非对称密钥,我们可以选择RSA 2K、3K或4K:
对于数字签名,我们可以添加P256、P521、sepc256k1的椭圆曲线方法:
网络安全中代价最高的事件之一是信任基础设施遭到破坏。因此,密钥的管理和控制非常重要,将它们存储在云中会带来很多好处。与此同时,我们看到了太多的数据泄露,而加密的使用使得数据泄露的范围可以减少到几乎为零——但我们必须确保我们的密钥得到了安全保存,至少以一种秘密的方式进行了备份。
这些密钥是我们最重要的秘密,所以不要被锁定在一个云提供商上,而且仍然存在有人进入我们的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篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!