AES-GCM
AES-GCM нь өгөгдлийг шифрлэхийн зэрэгцээ бүрэн бүтэн байдал болон жинхэнэ эсэхийг баталгаажуулдаг, өндөр хурдтай AEAD шифрлэлтийн горим юм.
- Стандарт
- NIST SP 800-38D
- Түлхүүрийн урт
- 128, 192 эсвэл 256 bit
- Nonce-ийн урт
- 96 bit
- 12 byte
- Баталгаажуулах tag
- 128 bit
- 16 byte
Чухал анхааруулга
- AES-GCM-д нэг нууц түлхүүрээр ижил nonce-ийг дахин ашиглаж болохгүй.
- Nonce давтагдвал ижил түлхүүрээр шифрлэсэн ciphertext-үүдийн хоорондын XOR хамаарлаас эх өгөгдлийн талаар мэдээлэл алдагдаж болно.
- Мөн GCM-ийн баталгаажуулалтын механизм суларч, зарим нөхцөлд authentication tag болон GHASH-тэй холбоотой халдлага хийх боломж үүсдэг. 96 битийн nonce-ийг санамсаргүй үүсгэх нь түгээмэл арга боловч санамсаргүй тоо үүсгэх нь давхцахгүй гэсэн баталгаа биш.
- Нэг түлхүүрийн хүрээнд олон nonce үүсгэх тусам давхцах магадлал нэмэгдэнэ.
- Иймээс өндөр ачаалалтай системд nonce-ийн давтагдашгүй байдлыг баталгаажуулах стратеги, зөвшөөрөгдөх ашиглалтын хязгаар болон түлхүүр солих бодлогыг төлөвлөх хэрэгтэй.
- Нэмж анхаарах зүйлс: - Authentication tag амжилттай шалгагдахаас өмнө тайлагдсан өгөгдлийг итгэмжлэгдсэн гэж үзэж болохгүй. - Nonce нь нууц байх албагүй ч тайлахад шаардлагатай тул ciphertext-ийн хамт найдвартай хадгална. - Түлхүүрийг код дотор шууд бичих, логт гаргах эсвэл зөвшөөрөлгүй этгээдэд дамжуулахаас зайлсхий. - Түлхүүр ашиглалтын хэмжээ, nonce-ийн удирдлага болон түлхүүр солих журмыг NIST SP 800-38D зэрэг холбогдох стандартад нийцүүлэн төлөвлөнө.
Юу вэ?
AES-GCM (Advanced Encryption Standard — Galois/Counter Mode) нь AES блок шифрийг Galois/Counter Mode буюу GCM горимтой хослуулсан, баталгаажуулалттай шифрлэлтийн арга юм.
AES нь өгөгдлийг шифрлэх үндсэн алгоритм бол GCM нь шифрлэлт болон өгөгдлийн бүрэн бүтэн байдал, жинхэнэ эсэхийг шалгах механизмыг нэгтгэдэг.
AES-GCM нь AEAD (Authenticated Encryption with Associated Data) төрөлд хамаарна. Энэ нь дараах боломжийг олгодог:
- Нууцлал (Confidentiality): plaintext буюу эх өгөгдлийг ciphertext болгон хувиргана. - Бүрэн бүтэн байдал (Integrity): ciphertext эсвэл баталгаажуулалтад хамруулсан өгөгдөл өөрчлөгдсөн эсэхийг илрүүлнэ. - Жинхэнэ эсэхийн баталгаажуулалт (Authentication): зөв түлхүүргүйгээр хүчинтэй authentication tag үүсгэхийг тооцооллын хувьд хүндрүүлнэ.
AES-GCM нь нэмэлт баталгаажуулах өгөгдөл (AAD — Additional Authenticated Data) ашиглах боломжтой. AAD нь шифрлэгдэхгүй боловч бүрэн бүтэн байдал болон жинхэнэ эсэхийн шалгалтад хамрагдана. Жишээлбэл, мессежийн дугаар, протоколын толгой хэсэг эсвэл хувилбарын мэдээллийг AAD болгон ашиглаж болно.
AES-GCM нь 128, 192 эсвэл 256 битийн AES түлхүүр ашиглах боломжтой. Практикт AES-128-GCM болон AES-256-GCM түгээмэл хэрэглэгддэг.
Хэрхэн ажилладаг вэ?
AES-GCM нь шифрлэлт болон баталгаажуулалтыг нэгтгэн ажиллуулдаг.
Түлхүүр болон nonce бэлтгэх
AES-128-GCM эсвэл AES-256-GCM-д тохирох нууц түлхүүр үүсгэнэ. Шифрлэлт бүрд тухайн түлхүүрийн хүрээнд давтагдаагүй nonce буюу IV ашиглах шаардлагатай. Стандарт хэрэглээнд 96 бит (12 байт) nonce-ийг зөвлөдөг.
Өгөгдлийг шифрлэх
GCM нь AES-ийг Counter (CTR) горимд ашиглан plaintext-ийг ciphertext болгон хувиргана. Иймээс өгөгдлийг блок бүрээр уламжлалт padding хийх шаардлагагүйгээр боловсруулах боломжтой.
Бүрэн бүтэн байдлыг баталгаажуулах
GHASH функц нь ciphertext болон шаардлагатай бол AAD дээр тооцоолол хийж, баталгаажуулалтын tag үүсгэхэд оролцоно. AES түлхүүр болон nonce нь tag-ийн тооцоололд мөн нөлөөлнө.
Ciphertext, nonce болон tag-ийг хадгалах
Шифрлэсэн өгөгдлийн хамт nonce болон authentication tag-ийг хадгалах буюу хүлээн авагчид дамжуулна. Эдгээрийг ихэнхдээ нууцлах шаардлагагүй боловч өөрчлөгдөөгүй байх ёстой.
Тайлах ба баталгаажуулах
Хүлээн авагч ижил түлхүүр, nonce болон tag-ийг ашиглан өгөгдлийг тайлж, tag-ийг шалгана. Баталгаажуулалт амжилтгүй бол өгөгдлийг хүчингүй гэж үзэж, тайлагдсан үр дүнг хэрэглэгчид харуулах эсвэл дараагийн боловсруулалтад ашиглаж болохгүй.
Чухал: Нэг түлхүүрээр ижил nonce-ийг давтан ашиглах нь AES-GCM-ийн нууцлал болон баталгаажуулалтыг ноцтой эвдэж болзошгүй.
Хаана ашиглагддаг вэ?
- **TLS 1.2 болон TLS 1.3** HTTPS холболтын өгөгдлийг шифрлэхэд AES-GCM ашигладаг cipher suite-үүд бий. Энэ нь өгөгдлийн нууцлал болон бүрэн бүтэн байдлыг хангахад тусална. **SSH** SSH протоколд AES-GCM ашигладаг шифрлэлтийн сонголтууд байдаг. Дэмжлэг нь ашиглаж буй SSH программ болон тохиргооноос хамаарна. **API болон сервер хоорондын өгөгдөл хамгаалалт** Нууц мэдээлэл
- токен
- тохиргоо болон бусад өгөгдлийг хадгалах
- дамжуулах үед AEAD шифрлэлтийн горим болгон ашиглаж болно. **Өгөгдлийн сан болон файл шифрлэлт** Файл
- өгөгдлийн сангийн талбар болон нууц тохиргоог шифрлэхэд ашиглаж болно. Гэхдээ дискний бүх блокийг шууд шифрлэх зориулалтаар AES-GCM-ийг нийтлэг сонголт гэж үзэхгүй; санамсаргүй хандалттай дискний шифрлэлтэд XTS-AES зэрэг зориулалтын горим түгээмэл хэрэглэгддэг. **Мессеж болон програмын өгөгдөл** Мессежийн агуулгыг шифрлэхийн зэрэгцээ нэмэлт толгой хэсгийг AAD болгон баталгаажуулж болно. Ингэснээр өгөгдөл шифрлэгдээгүй байсан ч түүний баталгаажуулалтад хамрагдсан хэсгийг өөрчлөх боломжгүй болгоно.
Түгээмэл алдаа
- - **Nonce давтан ашиглах:** Нэг түлхүүрээр ижил nonce ашиглах нь нууцлал болон баталгаажуулалтыг ноцтой эвдэж болзошгүй.
- - **Санамсаргүй nonce-ийн тоог хэт өсгөх:** 96 битийн санамсаргүй nonce-уудын давхцах магадлал тоо нэмэгдэх тусам өсдөг. Ашиглалтын хязгаарыг урьдчилан тооцох хэрэгтэй.
- - **Tag шалгалтаас өмнө өгөгдөл ашиглах:** Баталгаажуулалт амжилтгүй бол тайлагдсан өгөгдлийг бүхэлд нь хүчингүйд тооцно.
- - **Nonce-ийг хадгалахгүй орхих:** Тайлахад шифрлэх үеийн nonce шаардлагатай.
- - **Tag-ийг хадгалахгүй эсвэл буруу дамжуулах:** Tag байхгүй, буруу эсвэл өөрчлөгдсөн бол баталгаажуулалт амжилтгүй болно.
- - **Түлхүүрийг удаан хугацаанд хяналтгүй ашиглах:** Нэг түлхүүрийн дор үүсгэсэн nonce болон боловсруулсан өгөгдлийн хэмжээг хянаж, шаардлагатай үед түлхүүрийг шинэчилнэ.
- - **AAD-г буруу хэрэглэх:** AAD-д шифрлэгдээгүй боловч хамгаалах шаардлагатай толгой мэдээллийг оруулж болно. Шифрлэх болон тайлах үед ижил AAD ашиглах шаардлагатай.
- - **Буруу түлхүүрийн урт сонгох:** AES-GCM-ийн түлхүүр нь AES-ийн зөвшөөрөгдсөн 128, 192 эсвэл 256 битийн хэмжээтэй байх ёстой.
Жишээ код
import {
randomBytes,
createCipheriv,
createDecipheriv,
} from "node:crypto";
// Сургалтын жишээ: бодит системд түлхүүрийг
// аюулгүй хадгалалтаас авч, nonce-ийн давтагдашгүй байдлыг хянана.
const key = randomBytes(32); // AES-256: 256-bit түлхүүр
const nonce = randomBytes(12); // 96-bit nonce
const plaintext = "Нууц мессеж";
// Шифрлэх
const cipher = createCipheriv("aes-256-gcm", key, nonce);
const ciphertext = Buffer.concat([
cipher.update(plaintext, "utf8"),
cipher.final(),
]);
const authTag = cipher.getAuthTag();
// Тайлах ба баталгаажуулах
const decipher = createDecipheriv("aes-256-gcm", key, nonce);
decipher.setAuthTag(authTag);
try {
// update()-ийн гаралтыг баталгаажаагүй гэж үзнэ.
const firstPart = decipher.update(ciphertext);
const finalPart = decipher.final(); // Tag шалгалт энд хийгдэнэ
// final() амжилттай болсны дараа үр дүнг ашиглана.
const decrypted = Buffer.concat([
firstPart,
finalPart,
]).toString("utf8");
console.log(decrypted);
} catch {
console.error("Баталгаажуулалт амжилтгүй!");
}