برنامه نویسی

رمزگذاری نامتقارن و TLS در زنگ زدگی

در این مقاله ، من به طور خلاصه در مورد کاربرد رمزگذاری نامتقارن (ED25519) و TLS در زنگ زدگی بحث خواهم کرد.

  • SSL/TLS از رمزگذاری نامتقارن در مرحله دست زدن به دست می دهد تا کلیدها را به صورت ایمن مبادله کرده و از اصالت اطمینان حاصل کند.
  • رمزگذاری نامتقارن تضمین می کند که ارتباطات با استفاده از جفت های کلیدی دولتی و خصوصی ایمن است. از الگوریتم هایی مانند RSA ، ECDSA یا ED25519 برای تأیید هویت و بعضی اوقات کلیدها استفاده می شود.
  • ED25519 یک الگوریتم خاص است که در درجه اول برای امضای در رمزنگاری نامتقارن استفاده می شود ، یک روش سریع و ایمن برای تأیید این که داده ها (یا گواهینامه ها) از یک منبع قابل اعتماد است.

امضای داده ها

امضای داده با ED25519

ED25519 اغلب برای احراز هویت SSH استفاده می شود. شما کلید عمومی را روی سرور و کلید خصوصی روی مشتری ذخیره می کنید.
سپس می توانید بدون نیاز به وارد کردن رمز عبور ، با کلید خصوصی مشتری SSH به سرور SSH SSH بپردازید.

SSH (پوسته ایمن) از کلیدهای ED25519 برای تأیید اعتبار به روش زیر استفاده می کند:

  1. نسل کلید: کاربر یک جفت کلید ED25519 تولید می کند. کلید خصوصی به طور ایمن روی دستگاه مشتری نگه داشته می شود ، در حالی که کلید عمومی روی سرور قرار می گیرد.

  2. شروع اتصال: هنگامی که مشتری سعی در اتصال به سرور SSH می کند ، سرور یک چالش را برای مشتری ارسال می کند.

  3. امضای چالش: مشتری از کلید خصوصی خود برای امضای چالش استفاده می کند و یک امضا ایجاد می کند.

  4. تأیید امضا: مشتری این امضا را به سرور ارسال می کند. سرور سپس از کلید عمومی ذخیره شده برای تأیید امضای استفاده می کند.

  5. احراز هویت: اگر امضای معتبر باشد ، ثابت می کند که مشتری دارای کلید خصوصی مربوطه است و دسترسی به سرور دسترسی دارد.

این فرآیند تأیید هویت ایمن را بدون انتقال کلید خصوصی ، استفاده از قدرت و کارآیی الگوریتم ED25519 تضمین می کند.

بیایید از الگوریتم محبوب ED25519 استفاده کنیم که معمولاً برای کلیدهای SSH استفاده می شود.

use ring::rand::SystemRandom;
use ring::signature::{Ed25519KeyPair, KeyPair, Signature, UnparsedPublicKey, ED25519};

fn main() {
    // Generate key pair
    let rng = SystemRandom::new();
    let private_key = Ed25519KeyPair::generate_pkcs8(&rng).unwrap();
    let key_pair = Ed25519KeyPair::from_pkcs8(private_key.as_ref()).unwrap();

    // Data to sign
    let message = b"Hello, sign this data!";

    // Sign the message
    let signature: Signature = key_pair.sign(message);

    // Verify the signature using the public key
    let public_key = key_pair.public_key();
    let peer_public_key_bytes = public_key.as_ref();

    let public_key_for_verification = UnparsedPublicKey::new(&ED25519, peer_public_key_bytes);
    match public_key_for_verification.verify(message, signature.as_ref()) {
        Ok(_) => println!("Signature verified successfully!"),
        Err(_) => println!("Signature verification failed!"),
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

رمزگذاری RSA

از رمزگذاری نامتقارن برای رمزگذاری کلید عمومی استفاده می شود ، جایی که از کلید عمومی برای رمزگذاری داده ها استفاده می شود و از کلید خصوصی برای رمزگشایی داده ها استفاده می شود.

ED25519 برای رمزگذاری کلید عمومی استفاده نمی شود ، اما RSA است.

use rsa::{Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey};

fn main() {
    let mut rng = rand::thread_rng();
    let bits = 2048;
    let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
    let pub_key = RsaPublicKey::from(&priv_key);

    // Encrypt
    let data = b"hello world";
    let enc_data = pub_key
        .encrypt(&mut rng, Pkcs1v15Encrypt, &data[..])
        .expect("failed to encrypt");
    assert_ne!(&data[..], &enc_data[..]);

    // Decrypt
    let dec_data = priv_key
        .decrypt(Pkcs1v15Encrypt, &enc_data)
        .expect("failed to decrypt");
    assert_eq!(&data[..], &dec_data[..]);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

گواهی SSL برای سرور HTTPS

TLS/SSL پیچیده تر است ، شامل رمزگذاری نامتقارن ، رمزگذاری متقارن ، توابع هش و موارد دیگر است.

در اینجا ما فقط نحوه استفاده از گواهینامه خود را برای استفاده محلی نشان می دهیم.

بیایید یک گواهینامه خود امضا کنیم و با سرور Axum Rust سرو کنیم. گواهینامه خود امضا شده معمولاً در شبکه محلی ، بین دستگاه ها استفاده می شود ، اما به برخی از امنیت نیاز دارد.

گواهی SSL را تولید کنید

// rcgen = "0.13.1"
use rcgen::generate_simple_self_signed;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;

fn main() {
    let subject_alt_names = vec!["localhost".to_string()];
    let cert_key = generate_simple_self_signed(subject_alt_names).unwrap();
    let cert = cert_key.cert;
    let key = cert_key.key_pair;
    println!("Certificate generated successfully");
    let pem = cert.pem();
    let key = key.serialize_pem();

    println!("{}", pem);
    println!("{}", key);
    let pem_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("cert.pem");
    let key_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("key.pem");

    let mut pem_file = File::create(pem_path).unwrap();
    let mut key_file = File::create(key_path).unwrap();

    pem_file.write_all(pem.as_bytes()).unwrap();
    key_file.write_all(key.as_bytes()).unwrap();
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سرور ساده با TLS

use axum::{routing::get, Router};
use axum_server::tls_rustls::RustlsConfig;
use std::{net::SocketAddr, path::PathBuf};

#[tokio::main]
async fn main() {
    let https_port = 8080;
    rustls::crypto::ring::default_provider()
        .install_default()
        .expect("Failed to install default CryptoProvider");
    let handle = axum_server::Handle::new();
    let config = RustlsConfig::from_pem_file(
        PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("cert.pem"),
        PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("key.pem"),
    )
    .await
    .unwrap();
    let app = Router::new().route("https://dev.to/", get(handler));
    let addr = SocketAddr::from(([127, 0, 0, 1], https_port));
    tracing::debug!("listening on {addr}");
    axum_server::bind_rustls(addr, config)
        .handle(handle)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

async fn handler() -> &'static str {
    "Hello, World!"
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای مثالهای کامل با تغییر مسیر HTTP و خاموش کردن برازنده ، به repo github Axum بروید که حاوی نمونه های TLS است.

پرس و جو https

برای پرس و جو یک سرور HTTPS با گواهینامه خود امضا شده ، معمولاً خطا می کنید.

برای انجام آن در زنگ زدگی reqwest، مجموعه .danger_accept_invalid_certs(true)بشر

use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create a custom client
    let client = Client::builder()
        .danger_accept_invalid_certs(true)
        .build()?;

    // Make the request
    let response = client
        .get("https://localhost:3000")
        .send()
        .await?;

    println!("Status: {}", response.status());
    println!("Body: {}", response.text().await?);

    Ok(())
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در Node.js و Bun ، نیاز به تنظیم متغیر محیط NODE_TLS_REJECT_UNAUTHORIZED=0، اما این امر چک امنیتی را برای کل برنامه غیرفعال می کند ، نه فقط یک درخواست واحد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا