Ravindra BagaleCourses & study guides English

AWS SDK KMS Examples: Encrypt, Decrypt, Data Keys आणि Envelope Encryption (Python, PHP, Node.js)

KMS मध्ये encryption keys असतात ज्या AWS बाहेर जात नाहीत. Python, PHP आणि Node.js मधून key व alias बनवू, छोटी value encrypt/decrypt करू, encryption context ने बांधू, मोठ्या files साठी data keys ने envelope encryption करू, आणि document sign/verify करू. Example: Berlin मधली Hannah आणि अहमदाबादचा Kabir यांची health-records startup.

या chapter मध्ये तुम्ही काय शिकाल

  • Key व alias
  • Encrypt व decrypt
  • Encryption context
  • Data keys ने envelope encryption
  • Sign व verify

1. मोठं चित्र: bank locker

हे का लागतं?

Bank master key कधीच देत नाही. तुम्ही box clerk ला देता, तो vault मधल्या master key ने lock करून परत देतो. उघडायला परत विचारता, आणि bank प्रत्येक request log करते. KMS म्हणजे तो vault.

हे काय आहे?

Encrypt 4 KB पर्यंत चालतो. मोठ्या data साठी GenerateDataKey plaintext key (locally वापरा, मग विसरा) आणि तीच key encrypted (data शेजारी ठेवा) देतो. हे envelope encryption.

कसं करायचं (step by step)

Envelope encryptionGenerateDataKey (AES-256)Plaintext key ने file locally encryptFile + encrypted key साठवानंतर: encrypted key DecryptFile locally decrypt
प्रत्येक KMS call CloudTrail मध्ये log होतो, कोणी काय decrypt केलं ते कळतं.

2. Key आणि alias

हे का लागतं?

Hannah ला Frankfurt मध्ये patient notes साठी एक key हवी; code ने UUID नाही, सोपं नाव वापरावं.

हे काय आहे?

CreateKey default ने symmetric key बनवतो; CreateAlias त्याला alias/... नाव देतो.

कसं करायचं (step by step)

  1. Python.
import boto3
kms = boto3.client("kms", region_name="eu-central-1")
k = kms.create_key(Description="patient notes", Tags=[{"TagKey": "app", "TagValue": "health"}])["KeyMetadata"]
kms.create_alias(AliasName="alias/patient-notes", TargetKeyId=k["KeyId"])
kms.enable_key_rotation(KeyId=k["KeyId"])
print(k["KeyId"], k["KeySpec"])

अपेक्षित output:

1234abcd-12ab-34cd-56ef-1234567890ab SYMMETRIC_DEFAULT
  1. Node.js: alias ने describe.
import { KMSClient, DescribeKeyCommand } from "@aws-sdk/client-kms";
const kms = new KMSClient({ region: "eu-central-1" });
const { KeyMetadata: m } = await kms.send(new DescribeKeyCommand({ KeyId: "alias/patient-notes" }));
console.log(m.KeyState, m.KeyUsage);

अपेक्षित output:

Enabled ENCRYPT_DECRYPT
  1. PHP: aliases list.
<?php
require "vendor/autoload.php";
$kms = new Aws\Kms\KmsClient(["region" => "eu-central-1"]);
foreach ($kms->listAliases()["Aliases"] as $a)
    if (!str_starts_with($a["AliasName"], "alias/aws/")) echo $a["AliasName"], PHP_EOL;

अपेक्षित output:

alias/patient-notes
  1. Verify: rotation चालू.
aws kms get-key-rotation-status --key-id alias/patient-notes --region eu-central-1 --query KeyRotationEnabled

अपेक्षित output:

true

3. Context सह encrypt आणि decrypt

हे का लागतं?

Kabir प्रत्येक patient चा ID आणि insurance number ठेवतो; प्रत्येक फक्त त्याच patient साठी decrypt व्हायला हवा.

हे काय आहे?

EncryptionContext ciphertext ला बांधलेला key-value map. तोच map दिला नाही तर Decrypt fail. तो secret नाही, CloudTrail मध्ये दिसतो.

कसं करायचं (step by step)

  1. Python: encrypt.
import base64
ct = kms.encrypt(KeyId="alias/patient-notes", Plaintext=b"INS-DE-889012",
    EncryptionContext={"patient": "P-1001"})["CiphertextBlob"]
print(base64.b64encode(ct)[:24].decode(), len(ct), "bytes")

अपेक्षित output:

AQICAHh7k2Jd5n9mVqL1pZ3a 184 bytes
  1. Node.js: त्याच context ने decrypt.
import { DecryptCommand } from "@aws-sdk/client-kms";
const r = await kms.send(new DecryptCommand({ CiphertextBlob: Buffer.from(b64, "base64"),
  EncryptionContext: { patient: "P-1001" } }));
console.log(new TextDecoder().decode(r.Plaintext));

अपेक्षित output:

INS-DE-889012
  1. PHP: चुकीचा context fail.
<?php
try { $kms->decrypt(["CiphertextBlob" => base64_decode($b64), "EncryptionContext" => ["patient" => "P-2002"]]); }
catch (Aws\Kms\Exception\KmsException $e) { echo $e->getAwsErrorCode(), PHP_EOL; }

अपेक्षित output:

InvalidCiphertextException
  1. Verify: CloudTrail मध्ये decrypt.
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=Decrypt --max-results 1 --region eu-central-1 --query "Events[0].EventName" --output text

अपेक्षित output:

Decrypt

4. Files साठी envelope encryption

हे का लागतं?

Lyon चा 20 MB MRI report Encrypt (4 KB limit) साठी खूप मोठा.

हे काय आहे?

GenerateDataKey Plaintext आणि CiphertextBlob देतो. AES-GCM ने locally encrypt, encrypted key file शेजारी ठेवा, plaintext key फेकून द्या. AWS Encryption SDK हे सगळं करतं.

कसं करायचं (step by step)

  1. Python cryptography सह.
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
dk = kms.generate_data_key(KeyId="alias/patient-notes", KeySpec="AES_256")
nonce = os.urandom(12)
enc = AESGCM(dk["Plaintext"]).encrypt(nonce, open("mri.pdf", "rb").read(), None)
open("mri.pdf.enc", "wb").write(nonce + enc); open("mri.pdf.key", "wb").write(dk["CiphertextBlob"])
del dk
print("encrypted", len(enc))

अपेक्षित output:

encrypted 20971536
  1. Node.js: file decrypt.
import { readFileSync, writeFileSync } from "node:fs";
import { createDecipheriv } from "node:crypto";
const { Plaintext } = await kms.send(new DecryptCommand({ CiphertextBlob: readFileSync("mri.pdf.key") }));
const buf = readFileSync("mri.pdf.enc"), iv = buf.subarray(0, 12), tag = buf.subarray(-16), data = buf.subarray(12, -16);
const d = createDecipheriv("aes-256-gcm", Buffer.from(Plaintext), iv); d.setAuthTag(tag);
writeFileSync("mri.out.pdf", Buffer.concat([d.update(data), d.final()]));
console.log("decrypted");

अपेक्षित output:

decrypted
  1. PHP openssl सह.
<?php
$dk = $kms->generateDataKey(["KeyId" => "alias/patient-notes", "KeySpec" => "AES_256"]);
$iv = random_bytes(12);
$enc = openssl_encrypt(file_get_contents("scan.pdf"), "aes-256-gcm", $dk["Plaintext"], OPENSSL_RAW_DATA, $iv, $tag);
file_put_contents("scan.pdf.enc", $iv . $enc . $tag);
file_put_contents("scan.pdf.key", $dk["CiphertextBlob"]);
echo "ok ", strlen($enc), PHP_EOL;

अपेक्षित output:

ok 1048576
  1. Verify: files जुळतात.
sha256sum mri.pdf mri.out.pdf | awk '{print $1}' | uniq | wc -l

अपेक्षित output:

1

5. Sign आणि verify

हे का लागतं?

अहमदाबादहून Toronto च्या pharmacy ला पाठवलेल्या prescriptions बदलल्या नाहीत हे सिद्ध व्हायला हवं.

हे काय आहे?

KeyUsage SIGN_VERIFY सह asymmetric key. SHA-256 digest sign करा; public key असणारा कोणीही verify करू शकतो, किंवा Verify call.

कसं करायचं (step by step)

  1. Python: बनवून sign.
import hashlib
sk = kms.create_key(KeySpec="ECC_NIST_P256", KeyUsage="SIGN_VERIFY")["KeyMetadata"]["KeyId"]
digest = hashlib.sha256(b"Rx-5521: Amoxicillin 500mg x 10").digest()
sig = kms.sign(KeyId=sk, Message=digest, MessageType="DIGEST", SigningAlgorithm="ECDSA_SHA_256")["Signature"]
print(len(sig), "byte signature")

अपेक्षित output:

71 byte signature
  1. Node.js: verify.
import { VerifyCommand } from "@aws-sdk/client-kms";
const r = await kms.send(new VerifyCommand({ KeyId: sk, Message: digest, MessageType: "DIGEST",
  Signature: sig, SigningAlgorithm: "ECDSA_SHA_256" }));
console.log(r.SignatureValid);

अपेक्षित output:

true
  1. PHP: pharmacy साठी public key export.
<?php
$pub = $kms->getPublicKey(["KeyId" => $sk])["PublicKey"];
$pem = "-----BEGIN PUBLIC KEY-----\n" . chunk_split(base64_encode($pub), 64) . "-----END PUBLIC KEY-----\n";
file_put_contents("rx-pub.pem", $pem);
echo openssl_verify("Rx-5521: Amoxicillin 500mg x 10", $sig, $pem, OPENSSL_ALGO_SHA256), PHP_EOL;

अपेक्षित output:

1
  1. openssl ने offline verify.
printf "Rx-5521: Amoxicillin 500mg x 10" | openssl dgst -sha256 -verify rx-pub.pem -signature rx.sig

अपेक्षित output:

Verified OK

6. हाच call Java, Go, .NET आणि CLI मध्ये

हे का लागतं?

Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.

हे काय आहे?

सगळे Encrypt API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.

कसं करायचं (step by step)

StackCode
AWS CLIaws kms encrypt --key-id alias/patient-notes --plaintext fileb://note.txt --encryption-context patient=P-1001 --query CiphertextBlob --output text
Java v2SdkBytes ct = kms.encrypt(b -> b.keyId("alias/patient-notes").plaintext(SdkBytes.fromUtf8String("x"))).ciphertextBlob();
Go v2out, _ := client.Encrypt(ctx, &kms.EncryptInput{KeyId: aws.String("alias/patient-notes"), Plaintext: []byte("x")})
.NETvar r = await kms.EncryptAsync(new EncryptRequest { KeyId = "alias/patient-notes", Plaintext = new MemoryStream(bytes) });

7. काहीही खर्च चालू राहू नये म्हणून cleanup

हे का लागतं?

चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.

हे काय आहे?

उलट्या क्रमाने delete करा: आधी children, मग parents.

कसं करायचं (step by step)

  1. Key deletion schedule (7–30 दिवस थांबा).
aws kms delete-alias --alias-name alias/patient-notes --region eu-central-1
aws kms schedule-key-deletion --key-id $KEY_ID --pending-window-in-days 7 --region eu-central-1

अपेक्षित output:

(no output means success)

Ravindra Bagale's Tip

KMS key delete केली तर तिने encrypt केलेला सर्व data कायमचा वाचता येत नाही. आधी disable करा आणि deletion schedule करण्याआधी आठवडा थांबा.

8. मुलाखत प्रश्न आणि उत्तरं

प्र. Encrypt ची max plaintext?

4 KB.

प्र. Envelope encryption म्हणजे?

Data key ने data, KMS ने data key.

प्र. Encryption context का?

Ciphertext metadata ला बांधतो.

प्र. Symmetric Decrypt ला KeyId?

नाही.

प्र. Bahereच्यांना verify कसं?

GetPublicKey.

घरी करून बघा

  1. Node.js मध्ये GenerateDataKey ने JSON record encrypt करून दोन्ही भाग S3 मध्ये ठेवा.
  2. PHP मधून ReEncrypt ने ciphertext नवीन key वर न्या.

थोडक्यात सांगायचं तर

  1. CreateKey + alias + rotation.
  2. Encrypt/Decrypt ≤ 4 KB.
  3. Encryption context.
  4. Files साठी GenerateDataKey.
  5. Asymmetric Sign/Verify.

सराव Tasks

या scenario बद्दल

Seoul Beauty Lab हा सोल मधला सौंदर्य प्रसाधने व्यवसाय आहे. Ji-woo Park त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे KRW मध्ये मोजले जातात आणि AWS resources ap-northeast-2 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 10

सोपं KMS key बनवा

का: Customer managed key ने कोण encrypt/decrypt करू शकतो ते तुम्ही ठरवता.

काय करायचं: "seoulbeauty data key" description सह KMS key बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

सोपं दरवर्षी key rotation सुरू करा

का: Automatic rotation जुना data न मोडता key material बदलतो.

काय करायचं: Key 1234abcd-12ab-34cd-56ef-1234567890ab साठी automatic rotation सुरू करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

सोपं /16 मध्ये किती addresses?

का: VPC size ठरवायला ही संख्या लागते.

काय करायचं: Seoul Beauty Lab चा VPC 10.71.0.0/16. एकूण किती IP addresses?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं SSH चा port

का: Security group rules ला योग्य port हवा.

काय करायचं: SSH साठी security group ने कोणता TCP port उघडावा?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम Key ला सोपं alias द्या

का: Aliases key IDs पेक्षा वाचायला सोपे.

काय करायचं: Key 1234abcd-12ab-34cd-56ef-1234567890ab साठी alias/seoulbeauty-data alias बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Blob decrypt करा

का: Ciphertext ला कोणत्या key ने बनवलं ते माहीत असतं.

काय करायचं: secret.enc मधला ciphertext decrypt करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम छोटी file encrypt करा

का: KMS Encrypt 4 KB पर्यंतच्या data साठी, उदा. password किंवा token.

काय करायचं: secret.txt ला alias/seoulbeauty-data key ने encrypt करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Key वापरा, manage नाही

का: Apps ना Encrypt/Decrypt; keys फक्त admins बदलतात.

काय करायचं: फक्त arn:aws:kms:ap-northeast-2:119519391020:key/1234abcd-12ab-34cd-56ef-1234567890ab वर kms:Encrypt, kms:Decrypt, kms:GenerateDataKey allow करा.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

अवघड Data key बनवा

का: Envelope encryption: KMS data key देतो; मोठ्या files locally encrypt करता.

काय करायचं: alias/seoulbeauty-data खाली AES_256 data key बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड KMS ने default encryption

का: Default encryption मुळे प्रत्येक नवा object encrypt होतो.

काय करायचं: enc.json मधल्या encryption settings seoulbeauty-hr-docs bucket ला लावा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

KMS encrypt. Encrypt: 4 KB पर्यंत. Key id ऐवजी alias. Decrypt key स्वतः शोधतो. EncryptionContext जोडा.
उजळणी card: KMS encrypt · PNG download करा · Card page उघडा
Envelope encryption. GenerateDataKey: plain + encrypted. File local encrypt (AES-GCM). फक्त encrypted key ठेवा. वापरानंतर plain key पुसा.
उजळणी card: Envelope encryption · PNG download करा · Card page उघडा
Direct Encrypt vs Envelope. KMS तुमचा data encrypt करतो. / KMS data key encrypt करतो.
तुलना: Direct Encrypt vs Envelope · PNG download करा · Card page उघडा
KMS InvalidCiphertextException?. EncryptionContext वेगळा. Ciphertext मध्ये बदल झाला. Decrypt आधी Base64 decode.
मुलाखत card: KMS InvalidCiphertextException? · PNG download करा · Card page उघडा

अजून cards: Ravi Sir's Cards.