JSON e chiavi di crittografia

Feb 02 2023
Allora che aspetto ha una chiave di crittografia in questi giorni? Beh, dipende se sei un computer o un essere umano. Per un computer, è solo un mucchio di 1 e 0, ma per gli umani non siamo così bravi a interpretare il binario.

Allora che aspetto ha una chiave di crittografia in questi giorni? Beh, dipende se sei un computer o un essere umano. Per un computer, è solo un mucchio di 1 e 0, ma per gli umani non siamo così bravi a interpretare il binario. Due formati comuni sono DER (binario) e PEM (Base64). Se interpretato come esadecimale, DER ha un aspetto simile a questo [ qui ]:

Il formato PEM è un po' più strutturato con un'intestazione e un piè di pagina speciali e con il testo Base64 in mezzo:

Nessuno di questi formati di file rivela molto sui dettagli della chiave, come l'identificatore di i, il tipo di crittografia utilizzato e così via. E quindi il formato JSON viene spesso utilizzato per visualizzare una chiave e Google Tink è un ottimo posto per visualizzare la chiave. Con questo possiamo definire una chiave simmetrica, e dove forniamo la chiave e l'ID, e quindi definire il tipo di chiave (poiché possiamo usare una gamma di metodi di crittografia). Di seguito utilizziamo una chiave 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

Per un MAC (Message Authentication Code), utilizziamo una chiave segreta condivisa e quindi possiamo usarla per controllare la firma del messaggio [ qui ]. Anche in questo caso stiamo generando una chiave GCM AES a 128 bit [ qui ]:

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

E in molte applicazioni utilizziamo un approccio ibrido, in cui possiamo proteggere la chiave simmetrica con una coppia di chiavi. Di seguito utilizziamo la crittografia ECIES per proteggere la chiave simmetrica che creiamo e quindi utilizziamo la chiave pubblica[ link ]. La chiave privata viene quindi utilizzata per decrittografare la chiave simmetrica:

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

AWSKMS

In AWS KMS (Key Management Store), utilizziamo un riferimento ARN (Amazon Resource Reference), ad esempio:

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

Ma estrai anche come formato JSON [ qui ]:

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

La bellezza di JSON è che possiamo definire i campi utilizzando un formato chiave-valore e quindi incapsulare praticamente qualsiasi oggetto dati. Poiché si tratta di un formato basato su testo, è facile per noi eseguire il porting da un sistema all'altro. Quindi, è PEM per gli elementi chiave principali, ma JSON consente la chiave e tutti i metadati associati.