رمزگذاری PGP
PGP مجموعهای استاندارد از الگوریتمهای رمزگذاری، رمزگشایی و امضا است که حریم خصوصی و احراز هویت رمزنگاریشده را فراهم میکند.
هنگام استفاده از PGP برای رمزگذاری بارهای داده، شرکا باید از موارد زیر پشتیبانی کنند:
- رمزگذاری و رمزگشایی بارهای داده با چندین کلید PGP.
- امضای پیلودها با چندین کلید PGP.
- تأیید یک payload با چندین امضا، که هر کدام از آنها میتواند امضایی با کلید ارائه شده توسط گوگل باشد.
- رمزگشایی پیلودهای کدگذاری شدهی مبتنی بر وبِ Base64.
کلیدهای عمومی PGP که به گوگل ارائه میشوند باید دارای یک زیرکلید برای رمزگذاری باشند. این زیرکلید امکان چرخش مستقل از کلید اصلی را فراهم میکند. کلید اصلی برای تأیید هویت استفاده میشود. کلیدهای خصوصی باید کلیدهای RSA با طول عمر 2048 بیت (یا بیشتر) باشند که در عرض یک سال منقضی میشوند و حداکثر طول عمر آنها دو سال است .
قبل از شروع توسعه، باید کلیدهای PGP را با گوگل رد و بدل کنید. در این مرحله، یک جفت کلید عمومی-خصوصی PGP ایجاد میکنید، کلید عمومی را به گوگل ارائه میدهید و یک کلید عمومی از گوگل دریافت میکنید. در طول توسعه، فقط باید کلیدهای sandbox مورد استفاده برای توسعه و آزمایش خارج از محیط تولید را رد و بدل کنید. قبل از آزمایش و راهاندازی محیط تولید، باید یک تبادل کلید دیگر برای محیط تولید انجام دهید.
تولید یک کلید PGP جدید
با فرض اینکه یک فایل باینری GPG در مسیر سیستم خود دارید، میتوانید از دستور POSIX زیر برای ایجاد یک جفت کلید جدید استفاده کنید.
$ gpg --full-generate-key
وقتی از شما خواسته شد، یک کلید RSA با حداقل 2048 بیت آنتروپی و تاریخ انقضای 1-2 سال انتخاب کنید. این دستور باید هم یک کلید اصلی (با برچسب SC، برای 'S'signing و 'C'certificate generation') و هم یک کلید فرعی (با برچسب E، برای 'E'ncryption') ایجاد کند.
پیکربندی کتابخانه PGP
ارسال پیلودها
- هنگام امضا، باید از الگوریتم
SHA384به عنوان الگوریتم خلاصه استفاده کنید؛SHA1یاMD5استفاده نکنید. - هنگام رمزگذاری، باید از
AES256به عنوان الگوریتم رمزگذاری متقارن استفاده کنید؛CAST5یاIDEAاستفاده نکنید. - هنگام رمزگذاری یا امضای پیامها، حتماً زیرکلید مربوط به هدف مربوطه را انتخاب کنید؛ از کلید
CAN_SIGNبرای امضا و از کلیدENCRYPT_COMMS/ENCRYPT_STORAGEبرای رمزگذاری استفاده کنید.
دریافت پیلودها
- هنگام تأیید یک payload، مطمئن شوید که کتابخانه شما از الگوریتمهای هش مدرن مانند
SHA384پشتیبانی میکند. گوگل از ۱۴ مه ۲۰۲۳ استفاده از آن را روی تمام کلیدهای جدید آغاز خواهد کرد. - هنگام رمزگشایی یک فایل مخرب، مطمئن شوید که کتابخانه شما از الگوریتمهای رمزگذاری متقارن مدرن مانند
AES256پشتیبانی میکند. گوگل از ۱۴ مه ۲۰۲۳ استفاده از آن را روی تمام کلیدهای جدید آغاز خواهد کرد.
مثال رمزگذاری GPG Payload
دستور زیر نمونهای از نحوه انتخاب گزینههای امن هنگام استفاده از GPG است. انتظار میرود این عملیات در یک محیط قابل اعتماد انجام شود که در آن افراد به کلیدهای خصوصی یا فایلهای ورودی حساس دسترسی ندارند.
gpg --output signed-and-encrypted.pgp \
--sign --digest-algo SHA384 \
--encrypt --cipher-algo AES256 \
--armor \
--recipient {key_id} \
input.txt
GPG به طور خودکار کلید مناسب را از بسته نرمافزاری برای هر عملیاتی که از آن میخواهید انجام دهد، انتخاب میکند.
رمزگذاری JWE با امضای JWS
رمزگذاری وب JSON (JWE) استانداردی است که توسط rfc7516 برای رمزگذاری محتوا در سطح برنامه تعریف شده است. امضای وب JSON (JWS) استانداردی است که توسط rfc7515 برای امضای محتوا در سطح برنامه تعریف شده است.
درخواستها و پاسخها با استفاده از توکنهای JWE و با استفاده از رمزگذاری نامتقارن (کلید عمومی) و با گزینه "Compact Serialization" رمزگذاری میشوند. توکن JWE شامل محتوای امضا شده به عنوان یک توکن JWS خواهد بود. JWS همچنین از کلیدهای نامتقارن استفاده میکند؛ کلید خصوصی برای امضا و کلید عمومی برای تأیید.
هنگام ارسال یک فایل مخرب، ابتدا آن را امضا کرده و سپس رمزگذاری کنید. هنگام دریافت یک فایل مخرب، ابتدا آن را رمزگشایی کرده و سپس امضا را تأیید کنید.
هنگام استفاده از JWE، شرکا باید از گزینههای زیر پشتیبانی کنند:
- سریالسازی فشرده.
- رمزگشایی فایلهای مخرب از یکی از چندین کلید JWE.
- الگوریتم RSA-OAEP، RSA-OAEP-256 یا ECDH-ES برای مدیریت کلید.
- در سرآیند
alg( بخش ۴.۱ از rfc7518 ) قرار داده شده است.
- در سرآیند
- الگوریتم A256GCM ، A128GCM ، A128CBC-HS256 یا A256CBC-HS512 برای رمزگذاری محتوا.
- در هدر
encقرار داده شده است.
- در هدر
- هدر
kidبرای شناسایی کلید رمزگذاری عمومی. - پیامهای مخربی که از رمزگذاری JWE استفاده میکنند باید از نوع محتوای application/jose; charset=utf-8 استفاده کنند.
هنگام استفاده از JWS، شرکا باید از گزینههای زیر پشتیبانی کنند:
- سریالسازی فشرده.
- تأیید بارهای داده از یکی از چندین کلید JWS.
- الگوریتم HS256، HS384، HS512، RS256، RS384، RS512، ES256، PS256، PS384 یا PS512 برای ایجاد امضا.
- در سرآیند
alg( بخش ۳.۱ از RFC 7518 ) قرار داده شده است.
- در سرآیند
- هدر
kidبرای شناسایی کلید امضای خصوصی.
رشتههای JWE/JWS به صورت رشتههای UTF-8 کدگذاری میشوند و حجم دادههای آنها میتواند دلخواه باشد.
کلیدهای خصوصی باید از نوع RSA/ECDH-ES باشند که در عرض یک سال و حداکثر تا دو سال منقضی میشوند. هویت تمام کلیدهای خصوصی باید همیشه روی سرور همکار باقی بماند و بر این اساس، تمام مقادیر امضا باید روی سرور همکار محاسبه شوند.
قبل از شروع توسعه، باید کلیدهای JWE و JWS را با گوگل رد و بدل کنید. کلیدها باید در قالب JWK، همانطور که در rfc7517 تعریف شده است، رد و بدل شوند. در این مرحله، شما یک جفت کلید عمومی-خصوصی ایجاد میکنید، کلید عمومی را به گوگل ارائه میدهید و یک کلید عمومی از گوگل دریافت میکنید. در طول توسعه، فقط باید کلیدهای sandbox مورد استفاده برای توسعه و آزمایش خارج از محیط تولید را رد و بدل کنید. قبل از آزمایش و راهاندازی محیط تولید، باید یک تبادل کلید دیگر برای محیط تولید انجام دهید.