OpenSSL 3.0:多方面詳解

OpenSSL 是一個開放式密碼庫,具有處理加密、解密、簽名和驗簽等功能。最新版的 OpenSSL 3.0 於2021年9月30日正式發佈,它相較於之前的版本,在多方面都有了重大的改進。本文將從幾個方面對 OpenSSL 3.0 進行詳細闡述,方便大家更好地了解其功能。

一、加解密功能增強

1、支持原生 AES_GCM 加密方式

OpenSSL 3.0 版本中加入了原生的 AES_GCM 加密方式,用於加解密信息。相較於之前的版本,該方式更加高效和安全,因為它用一個隨機數和一個計數器作為標識,從而避免了一個密鑰重複加密同一消息的情況,增強了加密安全性。

    // 示例代碼
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);

2、支持 Elliptic Curve Qu-Vanstone (ECQV)證書頒發機構的擴展

OpenSSL 3.0 可以使用 Elliptic Curve Qu-Vanstone (ECQV) 證書頒發機構來生成證書,這將使證書更加高效,並降低了證書驗證的負擔。同時,該證書機構可以在減少證書大小的同時,不影響證書的安全性。

    // 示例代碼
    X509_REQ * req = X509_REQ_new();

    EVP_PKEY * pkey = EVP_PKEY_new();
    int ecgrp_nid = OBJ_txt2nid("prime256v1");
    EC_KEY * ec_key = EC_KEY_new_by_curve_name(ecgrp_nid);
    assert(ec_key != NULL);
    assert(pkey != NULL);
    assert(EVP_PKEY_assign_EC_KEY(pkey, ec_key) == 1);
    assert(X509_REQ_set_pubkey(req, pkey) == 1);

    X509_NAME *name = X509_NAME_new();
    X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (const unsigned char *)"AU", -1, -1, 0);
    X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, (const unsigned char *)"Test", -1, -1, 0);
    X509_REQ_set_subject_name(req, name);

二、HTTPS支持改進

1、支持 1.3 版本的 TLS 協議

OpenSSL 3.0 版本加入了對 TLS 1.3 版本的支持,該版本協議在加密方面擁有更好的性能,並且更加註重安全性,從而使 HTTPS 連接更加安全,相較於之前版本來說更加強大。

    // 示例代碼
    SSL_CTX *ctx;
    SSL *ssl;
    int ret;

    ...
    SSL_library_init();
    ctx = SSL_CTX_new(TLSv1_2_method());
    SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!MD5");
    
    ...

    // TLS 1.3 支持
    SSL_CTX_set_max_version(ctx, TLS1_3_VERSION);

    ...

    ssl = SSL_new(ctx);
    ret = SSL_set_fd(ssl, socket_fd);
    ret = SSL_connect(ssl);

2、增強的 SSL/TLS 配置檢測

OpenSSL 3.0 中增加了對 SSL/TLS 配置的檢測,可以檢測加密協議配置、密碼套件安全性和證書鏈的配置,從而使 HTTPS 連接更加可靠、安全。

    // 示例代碼
    SSL_CTX *ctx;
    SSL *ssl;
    int ret;

    ...
    SSL_library_init();
    ctx = SSL_CTX_new(TLSv1_2_method());
    SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!MD5");
    
    ...

    // 配置檢測
    SSL_CTX_set_security_level(ctx, 2);

    ...

    ssl = SSL_new(ctx);
    ret = SSL_set_fd(ssl, socket_fd);
    ret = SSL_connect(ssl);

三、安全性方面的提升

1、支持 OpenSSL Security Policy

OpenSSL 3.0 版本中引入了 OpenSSL Security Policy,用於管理 OpenSSL 應用程序的安全策略和配置細則。該功能提供了一種可擴展的結構,使得應用程序更加靈活、安全、易於維護。

    // 示例代碼
    OSSL_PROVIDER *default_provider = OSSL_PROVIDER_load(NULL, "default");
    OSSL_PARAM params[1] = {
        OSSL_PARAM_utf8_string(const_cast("system_default"), NULL)
    };
    EVP_CTX *ctx = EVP_CTX_new();
    EVP_DigestSignInit_ex(ctx, NULL, NULL, NULL, NULL);
    EVP_DigestSignVerifyInit_ex(ctx, NULL, NULL, NULL, NULL);
    EVP_MAC_CTX_new_id(NULL, "HMAC", NULL);
    OSSL_PARAM params[2] = {
        OSSL_PARAM_utf8_string(const_cast("digest"), const_cast("SHA256")),
        OSSL_PARAM_UTF8_STRING(const_cast("hmac_key"), const_cast("some_key"))
    };
    EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", params);

2、支持 X25519 密鑰交換算法

OpenSSL 3.0 版本提供了對 X25519 密鑰交換算法的支持,該算法能夠提供更高的安全性,更好的性能和更小的代碼實現。可以在不犧牲啟明文的情況下,實現更好的安全性。

    // 示例代碼
    EVP_PKEY *pkey = EVP_PKEY_new();
    assert(pkey != NULL);
    assert(EVP_PKEY_assign_EC_KEY(pkey, ec_key) == 1);

    EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
    assert(ctx != NULL);
    EVP_PKEY_derive_init(ctx);
    EVP_PKEY_derive_set_peer(ctx, peer_pkey);

    size_t len;
    EVP_PKEY_derive(ctx, NULL, &len);
    unsigned char *shkey = (unsigned char*)OPENSSL_malloc(len);
    if (EVP_PKEY_derive(ctx, shkey, &len) <= 0) {
        // 處理錯誤
    }

四、性能提升

1、支持 AVX2 指令集

OpenSSL 3.0 版本加入了 AVX2 指令集的支持,這將使得 OpenSSL 應用程序的計算速度更快,提升了應用程序的整體性能。在使用有 AVX2 指令集的處理器時,將會使得應用程序性能得到明顯的提高。

    // 示例代碼
    static void ChaCha_avx2_20_ord_key12(uint32_t *out, const uint32_t *inp, const uint32_t *key) {
    __m256i v0 = _mm256_loadu_si256((__m256i*)(inp + 0));
    __m256i v1 = _mm256_loadu_si256((__m256i*)(inp + 8));
    __m256i v2 = _mm256_loadu_si256((__m256i*)(inp + 12));
    __m256i v3 = _mm256_loadu_si256((__m256i*)(inp + 16));
    __m256i v4 = _mm256_loadu_si256((__m256i*)(key + 0));
    __m256i v5 = _mm256_loadu_si256((__m256i*)(key + 8));
    __m256i v6 = _mm256_loadu_si256((__m256i*)(key + 12));

    int i;
    for (i = 0; i < 10; i++) {
        QUARTERROUND(v0, v1, v2, v3);
        QUARTERROUND(v4, v5, v6, v7);
        QUARTERROUND(v0, v5, v10, v15);
        QUARTERROUND(v1, v6, v11, v12);
        QUARTERROUND(v2, v7, v8, v13);
        QUARTERROUND(v3, v4, v9, v14);
    }

    _mm256_storeu_si256((__m256i*)(out + 0), v0);
    _mm256_storeu_si256((__m256i*)(out + 8), v1);
    _mm256_storeu_si256((__m256i*)(out + 12), v2);
    _mm256_storeu_si256((__m256i*)(out + 16), v3);
}

2、支持 OpenMP 多線程並行處理

OpenSSL 3.0 版本增加了對 OpenMP 多線程並行處理的支持,這將使得 OpenSSL 應用程序更快速地處理數據,提高了整體的性能。同時,OpenMP 在多核處理器上的優化也讓 OpenSSL 應用程序變得更加高效。

    // 示例代碼
    #pragma omp parallel for
    for (int i = 0; i < len; i++) {
        out[i] = in[i] ^ key[i];
        ...
    }

總結

本文對 OpenSSL 3.0 在多個方面做了詳細的解釋和演示。可以看出,OpenSSL 在安全性、性能、功能方面都有了很大的提升,並且增加了對新的特性的支持,如 TLS 1.3、AVX2、OpenMP 等,使得其成為當前最為先進、可靠的加密庫之一。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/153541.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-14 03:06
下一篇 2024-11-14 03:06

相關推薦

  • Python取較大值的多方面

    Python是一款流行的編程語言,廣泛應用於數據分析、科學計算、Web開發等領域。作為一名全能開發工程師,了解Python的取較大值方法非常必要。本文將從多個方面對Python取較…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25

發表回復

登錄後才能評論