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