JSON và khóa mã hóa

Feb 02 2023
Vậy khóa mã hóa ngày nay trông như thế nào? Chà, nó phụ thuộc vào việc bạn là máy tính hay con người. Đối với máy tính, nó chỉ là một loạt các số 1 và 0, nhưng đối với con người, chúng ta không giỏi trong việc diễn giải hệ nhị phân.

Vậy khóa mã hóa ngày nay trông như thế nào? Chà, nó phụ thuộc vào việc bạn là máy tính hay con người. Đối với máy tính, nó chỉ là một loạt các số 1 và 0, nhưng đối với con người, chúng ta không giỏi trong việc diễn giải hệ nhị phân. Hai định dạng phổ biến là DER (nhị phân) và PEM (Base64). Khi được hiểu là hệ thập lục phân, DER trông giống như thế này [ tại đây ]:

Định dạng PEM có cấu trúc hơn một chút với đầu trang và chân trang đặc biệt và với văn bản Base64 ở giữa:

Không có định dạng tệp nào trong số này cung cấp nhiều thông tin chi tiết về khóa, chẳng hạn như số nhận dạng của tôi, loại mã hóa được sử dụng, v.v. Và do đó, định dạng JSON thường được sử dụng để xem khóa và Google Tink là một nơi tuyệt vời để xem khóa. Với điều này, chúng tôi có thể xác định khóa đối xứng và nơi chúng tôi cung cấp khóa và ID, sau đó xác định loại khóa (vì chúng tôi có thể sử dụng nhiều phương thức mã hóa). Trong phần sau, chúng tôi sử dụng khóa AES GCM: [ liên kết ]

{
    "primaryKeyId": 1331912396,
    "key": [{
        "keyData": {
            "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
            "keyMaterialType": "SYMMETRIC",
            "value": "GhBpskWWTrE27e2w67X4TzfS"
        },
        "outputPrefixType": "TINK",
        "keyId": 1331912396,
        "status": "ENABLED"
    }]
}

1A1069B245964EB136EDEDB0EBB5F84F37D2

Đối với MAC (Mã xác thực thư), chúng tôi sử dụng khóa bí mật dùng chung và sau đó có thể sử dụng khóa này để kiểm tra chữ ký của thư [ tại đây ]. Một lần nữa trong trường hợp này, chúng tôi đang tạo khóa AES GCM 128 bit [ tại đây ]:

{
    "primaryKeyId": 1331912396,
    "key": [{
        "keyData": {
            "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
            "keyMaterialType": "SYMMETRIC",
            "value": "GhBpskWWTrE27e2w67X4TzfS"
        },
        "outputPrefixType": "TINK",
        "keyId": 1331912396,
        "status": "ENABLED"
    }]
}

{
 “primaryKeyId”: 438545957,
 “key”: [{
 “keyData”: {
 “typeUrl”: “type.googleapis.com/google.crypto.tink.EcdsaPrivateKey”,
 “keyMaterialType”: “ASYMMETRIC_PRIVATE”,
 “value”: “Ek0SBggDEAIYAhohAP4v0pziVF9He/fn8BgApUHOu2Y1TkMcejrYC4U24M3xIiBAf0AIU72H5uVIP1S6ULGLaDf4td3/RIb4F58z2Md/khogJsuTDxaY/Q0CmENKlTQIOCXEZ+qvdAW0Rkvix6Wehl4=”
 },
 “outputPrefixType”: “TINK”,
 “keyId”: 438545957,
 “status”: “ENABLED”
 }]
}

{
 “primaryKeyId”: 438545957,
 “key”: [{
 “keyData”: {
 “typeUrl”: “type.googleapis.com/google.crypto.tink.EcdsaPublicKey”,
 “keyMaterialType”: “ASYMMETRIC_PUBLIC”,
 “value”: “EgYIAxACGAIaIQD+L9Kc4lRfR3v35/AYAKVBzrtmNU5DHHo62AuFNuDN8SIgQH9ACFO9h+blSD9UulCxi2g3+LXd/0SG+BefM9jHf5I=”
 },
 “outputPrefixType”: “TINK”,
 “keyId”: 438545957,
 “status”: “ENABLED”
 }]
}

Và trong nhiều ứng dụng, chúng tôi sử dụng phương pháp kết hợp, trong đó chúng tôi có thể bảo vệ khóa đối xứng bằng một cặp khóa. Trong phần sau, chúng tôi sử dụng mã hóa ECIES để bảo vệ khóa đối xứng mà chúng tôi tạo và sau đó sử dụng khóa chung[ liên kết ]. Khóa riêng sau đó được sử dụng để giải mã khóa đối xứng:

{
 “primaryKeyId”: 1992984960,
 “key”: [{
 “keyData”: {
 “typeUrl”: “type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey”,
 “keyMaterialType”: “ASYMMETRIC_PUBLIC”,
 “value”: “EkQKBAgCEAMSOhI4CjB0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5jcnlwdG8udGluay5BZXNHY21LZXkSAhAQGAEYARohAOaHVTjvjhpGaHv5mhuXz3Nc+Mb7RE5sMyAsv7YCB8UjIiAOaSLbqRE7ddVM14kWiNoPWB/U2MNluwLlAjw39zwAlw==”
 },
 “outputPrefixType”: “TINK”,
 “keyId”: 1992984960,
 “status”: “ENABLED”
 }]
}

{
    "primaryKeyId": 1428191678,
    "key": [{
        "keyData": {
            "typeUrl": "type.googleapis.com/google.crypto.tink.AesSivKey",
            "keyMaterialType": "SYMMETRIC",
            "value": "EkAFkhmlhYkmClmpz/vGzojJVgA/IQIMSty7rL8TXxyu9m/W0ZtzCddmSLFj7r8V/R0CywJ89KxdMVzdR+GDQH2w"
        },
        "outputPrefixType": "TINK",
        "keyId": 1428191678,
        "status": "ENABLED"
    }]
}

AWS KMS

Trong AWS KMS (Key Management Store), chúng tôi sử dụng tham chiếu ARN (Tham chiếu tài nguyên Amazon), chẳng hạn như:

arn:aws:kms:us-east-1:713702076703:key/
c1ef5c60-b186-4a43-a71e-f3d55c211e5earn:aws:kms:us-east-1:103269750866:
alias/MySymKey

aws kms encrypt  --key-id alias/MySymKey   
 --plaintext fileb://1.txt   --query CiphertextBlob 
--output text > 1.out

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::103269750866:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::103269750866:user/asecuritysite",
                    "arn:aws:iam::103269750866:user/s3bucketuser",
                    "arn:aws:iam::103269750866:role/AWS-QuickSetup-StackSet-Local-AdministrationRole",
                    "arn:aws:iam::103269750866:user/bill",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200705-105358",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200621-094554",
                    "arn:aws:iam::103269750866:user/dbuser",
                    "arn:aws:iam::103269750866:role/AmazonEC2RoleforSSM",
                    "arn:aws:iam::103269750866:role/aws-ec2-spot-fleet-tagging-role",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200620-112942"
                ]
            },
            "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::103269750866:user/asecuritysite",
                    "arn:aws:iam::103269750866:user/s3bucketuser",
                    "arn:aws:iam::103269750866:role/AWS-QuickSetup-StackSet-Local-AdministrationRole",
                    "arn:aws:iam::103269750866:user/bill",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200705-105358",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200621-094554",
                    "arn:aws:iam::103269750866:user/dbuser",
                    "arn:aws:iam::103269750866:role/AmazonEC2RoleforSSM",
                    "arn:aws:iam::103269750866:role/aws-ec2-spot-fleet-tagging-role",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200620-112942"
                ]
            },
            "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::103269750866:user/asecuritysite",
                    "arn:aws:iam::103269750866:user/s3bucketuser",
                    "arn:aws:iam::103269750866:role/AWS-QuickSetup-StackSet-Local-AdministrationRole",
                    "arn:aws:iam::103269750866:user/bill",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200705-105358",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200621-094554",
                    "arn:aws:iam::103269750866:user/dbuser",
                    "arn:aws:iam::103269750866:role/AmazonEC2RoleforSSM",
                    "arn:aws:iam::103269750866:role/aws-ec2-spot-fleet-tagging-role",
                    "arn:aws:iam::103269750866:user/ses-smtp-user.20200620-112942"
                ]
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

Nhưng cũng trích xuất dưới dạng định dạng JSON [ tại đây ]:

% aws kms get-public-key --key-id alias/PublicKeyForDemo
{
    "KeyId": "arn:aws:kms:us-east-1:103269750866:key/de30e8e6-c753-4a2c-881a-53c761242644",
    "PublicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsXDtHOdCeteObzugPf6ENjeft6CDGjbaR9t40++q4jqtSd5JsdYel1Rn3mYL+oXqKQJz9o+aoXdCcMFkhu6wqqDVbIOPT2nsXIuO3p+0G7uUS93g3cc5RodEAn3jb2yBjHjvfs9OBSBM7bh6Kw21YuN/omU1GaL/d4o7+NYu0mDEAmb0Nh+1Q6lrpf+bu1YZ31gVpbLd78xGlv1dz2nqyBG8VaZW90fr05jDjcpDnWm1O9QXl0pEhwNGcvcsxcHodslAZrlzKUre/nZ5MTNL3uigw8w5l2uQLRFiIBpLlHKpcNBaxZu3Za5Mk2Dvj+1+L2PejLydAPfqQB5N8dsOAQIDAQAB",
    "CustomerMasterKeySpec": "RSA_2048",
    "KeySpec": "RSA_2048",
    "KeyUsage": "ENCRYPT_DECRYPT",
    "EncryptionAlgorithms": [
        "RSAES_OAEP_SHA_1",
        "RSAES_OAEP_SHA_256"
    ]
}

Cái hay của JSON là chúng ta có thể xác định các trường bằng định dạng khóa-giá trị và sau đó có thể gói gọn hầu như bất kỳ đối tượng dữ liệu nào. Vì nó là định dạng dựa trên văn bản nên chúng tôi dễ dàng chuyển từ hệ thống này sang hệ thống khác. Vì vậy, đó là PEM cho các phần tử khóa cốt lõi, nhưng JSON cho phép khóa và tất cả siêu dữ liệu được liên kết.