JSON 및 암호화 키
그렇다면 요즘 암호화 키는 어떤 모습일까요? 글쎄, 그것은 당신이 컴퓨터인지 인간인지에 달려 있습니다. 컴퓨터의 경우 1과 0의 집합일 뿐이지만 인간의 경우 이진법을 잘 해석하지 못합니다. 두 가지 일반적인 형식은 DER (바이너리) 및 PEM (Base64)입니다. 16진수로 해석하면 DER은 [ 여기 ] 와 같이 보입니다 .
PEM 형식은 특별한 머리글과 바닥글, 그리고 그 사이에 Base64 텍스트가 있는 좀 더 구조화되어 있습니다.
이러한 파일 형식 중 어느 것도 i의 식별자, 사용된 암호화 유형 등과 같은 키의 세부 정보에 대해 많은 정보를 제공하지 않습니다. 따라서 JSON 형식은 종종 키를 보는 데 사용되며 Google Tink는 키를 볼 수 있는 좋은 장소입니다. 이를 통해 대칭 키를 정의하고 키와 ID를 제공한 다음 키 유형을 정의할 수 있습니다(다양한 암호화 방법을 사용할 수 있으므로). 다음에서는 AES GCM 키를 사용합니다. [ 링크 ]
{
"primaryKeyId": 1331912396,
"key": [{
"keyData": {
"typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
"keyMaterialType": "SYMMETRIC",
"value": "GhBpskWWTrE27e2w67X4TzfS"
},
"outputPrefixType": "TINK",
"keyId": 1331912396,
"status": "ENABLED"
}]
}
1A1069B245964EB136EDEDB0EBB5F84F37D2
MAC(메시지 인증 코드)의 경우 공유 비밀 키를 사용하고 이를 사용하여 [ 여기 ] 메시지의 서명을 확인할 수 있습니다 . 이 경우에도 128비트 AES GCM 키를 생성합니다[ 여기 ]:
{
"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”
}]
}
그리고 많은 애플리케이션에서 우리는 키 쌍으로 대칭 키를 보호할 수 있는 하이브리드 접근 방식을 사용합니다. 다음에서는 ECIES 암호화를 사용하여 생성한 대칭 키를 보호한 다음 공개 키[ 링크 ]를 사용합니다. 그런 다음 개인 키를 사용하여 대칭 키를 해독합니다.
{
“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
AWS KMS(Key Management Store)에서는 다음과 같은 ARN(Amazon 리소스 참조) 참조를 사용합니다.
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"
}
}
}
]
}
그러나 JSON 형식으로도 추출합니다[ 여기 ]:
% 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"
]
}
JSON의 장점은 키-값 형식을 사용하여 필드를 정의할 수 있고 거의 모든 데이터 개체를 캡슐화할 수 있다는 것입니다. 텍스트 기반 형식이므로 한 시스템에서 다른 시스템으로 이식하기 쉽습니다. 따라서 핵심 키 요소에 대한 PEM이지만 JSON은 키 및 모든 관련 메타데이터를 허용합니다.

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































