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