JSON i klucze szyfrujące

Feb 02 2023
Jak obecnie wygląda klucz szyfrujący? Cóż, to zależy od tego, czy jesteś komputerem, czy człowiekiem. Dla komputera to tylko kilka zer i jedynek, ale dla ludzi nie jesteśmy tak dobrzy w interpretacji binarnej.

Jak obecnie wygląda klucz szyfrujący? Cóż, to zależy od tego, czy jesteś komputerem, czy człowiekiem. Dla komputera to tylko kilka zer i jedynek, ale dla ludzi nie jesteśmy tak dobrzy w interpretacji binarnej. Dwa popularne formaty to DER (binarny) i PEM (Base64). Interpretowane jako szesnastkowe, DER wygląda mniej więcej tak [ tutaj ]:

Format PEM ma nieco bardziej uporządkowaną strukturę ze specjalnym nagłówkiem i stopką oraz tekstem Base64 pomiędzy:

Żaden z tych formatów plików nie ujawnia szczegółów klucza, takich jak identyfikator i, typ zastosowanego szyfrowania i tak dalej. I tak format JSON jest często używany do przeglądania klucza, a Google Tink to świetne miejsce do przeglądania klucza. Dzięki temu możemy zdefiniować klucz symetryczny, gdzie podajemy klucz i identyfikator, a następnie zdefiniować typ klucza (ponieważ możemy użyć szeregu metod szyfrowania). Poniżej używamy klucza AES GCM: [ link ]

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

1A1069B245964EB136EDEDB0EBB5F84F37D2

W przypadku kodu MAC (Message Authentication Code) używamy wspólnego tajnego klucza, a następnie możemy go użyć do sprawdzenia podpisu wiadomości [ tutaj ]. Ponownie w tym przypadku generujemy 128-bitowy klucz AES GCM [ tutaj ]:

{
    "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”
 }]
}

W wielu aplikacjach stosujemy podejście hybrydowe, w którym możemy chronić klucz symetryczny za pomocą pary kluczy. Poniżej używamy szyfrowania ECIES do ochrony klucza symetrycznego, który tworzymy, a następnie używamy klucza publicznego [ link ]. Klucz prywatny jest następnie używany do odszyfrowania klucza symetrycznego:

{
 “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

W AWS KMS (Key Management Store) używamy referencji ARN (Amazon Resource Reference), takiej jak:

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"
                }
            }
        }
    ]
}

Ale także wyodrębnij jako format JSON [ tutaj ]:

% 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"
    ]
}

Piękno formatu JSON polega na tym, że możemy definiować pola za pomocą formatu klucz-wartość, a następnie hermetyzować praktycznie każdy obiekt danych. Ponieważ jest to format tekstowy, łatwo jest nam przenosić z jednego systemu do drugiego. Tak więc jest to PEM dla podstawowych kluczowych elementów, ale JSON pozwala na klucz i wszystkie powiązane metadane.