您的位置:

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 等,使得其成为当前最为先进、可靠的加密库之一。