我的公众号:密码学人CipherHUB 本文描述一种客户端-服务器加密通信方案,核心流程结合临时ECDH密钥交换、HKDF密钥强化、AES-GCM数据加密三阶段技术栈。 密钥强化与加密 采用HKDF处理SharedSecret DerivedKey = HKDF(SharedSecret, Salt, AdditionalInfo) - 敏感数据(SecretPlain )使用AES-GCM加密 {Cipher, Tag} = AES-GCM-Encrypt(DerivedKey, SecretPlain) 优化点:HKDF消除原始ECDH输出中的椭圆曲线坐标数学特征 服务端利用持久私钥计算相同SharedSecret,经相同HKDF流程获得DerivedKey。 设计思想 现代密码学分层设计思想: 非对称层:ECDH提供密钥协商(临时密钥实现前向保密) 转换层:HKDF消解算法耦合,输出标准化密钥 对称层:AES-GCM实现高速保密通信undefined
KDF(密钥派生函数) 采用HKDF将共享密钥扩展为三个核心参数:● key:对称加密密钥(如AES-GCM-256)● base_nonce:初始计数器● exporter_secret:扩展密钥通过 作为KEM算法# 使用HKDF_SHA512作为KDF算法# 使用AES256_GCM作为AEAD算法 alice_cipher_suite = CipherSuite.new( kem_id = KEMId.DHKEM_P521_HKDF_SHA512 , kdf_id = KDFId.HKDF_SHA512 , aead_id = 分割线# Bob配置相同的CipherSuite bob_cipher_suite = CipherSuite.new( kem_id = KEMId.DHKEM_P521_HKDF_SHA512 , kdf_id = KDFId.HKDF_SHA512 , aead_id = AEADId.AES256_GCM ,)# Bob解析自己的私钥# 将Bob
default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.hkdf import HKDF import os import timeit from typing import Tuple , Callable , Any , Optional def generate_random_data 从密码派生安全密钥 HKDF (HMAC-based Key Derivation Function) 是一种安全的密钥派生方法 它可以将弱密码(如用户输入的密码)转换为强密码学密钥 派生的安全密钥 """ # 如果没有提供盐值,生成随机盐值 if salt is None: salt = os.urandom(16) # 创建 HKDF 实例 # 算法:SHA-256,密钥长度,盐值,上下文信息,后端 hkdf = HKDF( algorithm = hashes.SHA256() ,
}}七、密钥管理与握手协议7.1 三层密钥派生ooderAgent 0.7.0采用分层密钥派生体系,确保前向安全:// 密钥派生层次// Master Key (HSM保护)// └── HKDF ("LTS") ──► LTSK (90天)// └── HKDF("STS") + ECDH ──► STSK (1小时/会话)public class KeyDerivation { * * 从Master Key派生LTSK */ public byte[] deriveLTSK(byte[] masterKey, String wid) { HKDF hkdf = HKDF.fromHmacSha256(); return hkdf.extract(masterKey, ("ooderAgent-LTS-" + wid).getBytes 派生 HKDF hkdf = HKDF.fromHmacSha256(); return hkdf.extract(ltsk, concat(sharedSecret, peerWid.getBytes
TLS 1.3 使用的是 HKDF(HMAC KDF)[RFC5869],即基于 HMAC 的 KDF 算法。它的原理是先提取再拓展。 HKDF 的两个步骤分别为 HKDF-Extract 和 Derive-Secret。 HKDF-Extract 的 计算方法如下图: HKDF-Extract(salt, IKM) -> PRK PRK = HMAC-Hash(salt, IKM) salt 为可选参数,使用盐可以提高 HKDF 算法的强度。 第一步, PSK 作为输入密钥, 和长度为0的盐通过 HKDF-Extract 生成 Early Secret。
基于口令的密钥保护 用户口令不直接用于加密,而是通过HKDF派生专用保护密钥: 设计优势: ● 口令与加密密钥隔离,降低口令泄露风险 ● HKDF提供密钥拉伸,抵御暴力破解攻击 ● 固定盐值确保密钥派生的一致性 相比RSA更短的密钥长度 ○ 更高的计算效率 对称加密算法 ● 算法: AES-256-GCM 认证加密模式,同时保障机密性和完整性 ○ 硬件加速支持,性能优异 ○ NIST认证标准 密钥派生函数 ● HKDF
encryptByPassword encryptByKey decryptByPassword decryptByKey hkdf pbkdf2 hashData validateData generateRandomKey hkdf 使用标准的 HKDF 算法从给定的输入键中导出一个键。在PHP7+使用的是hash_hkdf方法,小于PHP7使用hash_hmac方法。 : encryptByKey()、decryptByKey()、 encryptByPassword() 和 decryptByPassword(); 使用标准算法的密钥推导: pbkdf2() 和 hkdf
default_backendfrom cryptography.hazmat.primitives import hashesfrom cryptography.hazmat.primitives.kdf.hkdf salt: Optional[ bytes ] = None , key_length: int = 32) -> bytes: """ 使用 HKDF 从密码派生安全密钥 HKDF (HMAC-based Key Derivation Function) 是一种安全的密钥派生方法 它可以将弱密码(如用户输入的密码)转换为强密码学密钥 派生的安全密钥 """ # 如果没有提供盐值,生成随机盐值 if salt is None: salt = os.urandom(16) # 创建 HKDF 实例 # 算法:SHA-256,密钥长度,盐值,上下文信息,后端 hkdf = HKDF( algorithm = hashes.SHA256() ,
TLS1.3 使用的 HKDF 做密钥扩展,mmtls 也是选用的 HKDF 做密钥扩展。 两个函数分别是: HKDF-Extract( salt, initial-keying-material ) 该函数的作用是对 initial-keying-material 进行处理,保证它的熵均匀分别 HKDF-Expand( pseudorandom key, info, out_key_length ) 参数 pseudorandom key 是已经足够伪随机的密钥扩展材料,HKDF-Extract mmtls 最终使用的密钥是有 HKDF-Expand 扩展出来的。mmtls 把 info 参数分为:length,label,handshake_hash。 四、小结 mmtls 是参考 TLS1.3 草案标准设计与实现的,使用 ECDH 来做密钥协商,ECDSA 进行签名验证,AES-GCM 作为对称加密算法来对业务数据包进行认证加密,使用 HKDF 进行密钥扩展
/create-phar.php', 'secret'), PHP_EOL; // 05d1f8eb7683e190340c04fc43eba9db hkdf 与 pbkdf2 的 HASH 算法 接下来介绍的这两种算法又是特殊的两种 // hkdf pbkdf2 算法 // 算法 明文密码(原始二进制) 输出长度 应用程序/特定于上下文的信息字符串 salt值 $hkdf1 = hash_hkdf('sha256', '123456', 32, 'aes-256-encryption', random_bytes(2)); $hkdf2 = hash_hkdf('sha256 ', '123456', 32, 'sha-256-authentication', random_bytes(2)); var_dump($hkdf1); var_dump($hkdf2); // string sha256", '123456', random_bytes(2), 1000, 20), PHP_EOL; // e27156f9a6e2c55f3b72 hmac 只需要一个密钥就可以了,hash_hkdf
= HKDF-Expand-Label(key: early_secret, label: "derived", ctx: empty_hash, len: 48) handshake_secret = HKDF-Extract(salt: derived_secret, key: shared_secret) client_secret = HKDF-Expand-Label(key: handshake_secret , label: "key", ctx: "", len: 32) server_handshake_key = HKDF-Expand-Label(key: server_secret, label: : "", len: 12) server_handshake_iv = HKDF-Expand-Label(key: server_secret, label: "iv", ctx: "", len: = HKDF-Expand-Label(key: client_secret, label: "key", ctx: "", len: 32) server_application_key = HKDF-Expand-Label
这些函数支持HKDF (OpenSSL 1.1.0), 可以指定盐(可选)和特殊的上下文在密钥中; 也支持PBKDF2 (OpenSSL 1.0.2), 可以指定盐(可选)和生成密钥的次数.不太好理解 ,看个例子吧:HKDFSELECT AES_ENCRYPT('mytext','mykeystring', '', 'hkdf', 'salt', 'info');PBKDF2SELECT AES_ENCRYPT
和原版 TLS1.3 比,它保留了: 0-RTT 握手(提高短连接速度) AEAD 加密算法(认证 + 加密二合一) ECDH 密钥协商 + ECDSA 签名验证 HKDF 密钥扩展 + SHA256 精简密钥协商路径: 剪掉 TLS1.3 中三次 Extract + 四次 Expand 的 复杂工序,微信自研一套高效 HKDF 派生逻辑,性能提升显著。
HKDF包括 extract_then_expand 的两阶段过程,extract过程增加密钥材料的随机性能,expand则是加固密钥材料的安全性,注意PRF投入使用中实际只是实现了HKDF的expand 部分,所以不算是完整的HKDF算法。 最后可以看一份wiki上使用Python实现的HKDF代码案例:#! NewSessionTicket 使用 server_application_traffic_secret 加密,通过 resumption_key 和 HKDF 算法计算出PSK的公式如下: HKDF-Expand-Label 具体可以看 RFC 5869:基于 HMAC 的提取和扩展密钥派生函数 (HKDF) (rfc-editor.org)HKDF-Extract(salt, IKM) -> PRKHKDF-Expand(
), fileToWrite), context, masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF (), fileToRead), context, masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF
除基础的 HTTPS 之外,CipherHUB 在应用层实现了完整的信道加密机制: ● 使用 ECC-SECD-521R进行密钥协商 ● 通过 ECDH + HKDF-SHA512派生会话密钥 ● 业务数据使用
image.png HKDF。 密钥的提取和扩展都用HMAC。 image.png 基于密码的KDF。 如何从密码中提取密钥?密码通常具有很少的熵,约为20位左右的熵。不能直接用HKDF。
[i3hkdf8qht.gif] 7.你是不是打断点时还要去改代码? [v69dpoidwm.gif] 8.看 dom 层级的最直观的方式?
优化并发数据共享 499: 结构化并发(第四次预览版) 通过 StructuredTaskScope 简化多线程任务管理 API 变更与新增 478: 密钥派生函数 API(预览版) 提供标准化的密钥派生函数(如 HKDF
一、握手摘要ClientHello:随机32B+曲线25519公钥ServerHello:返回服务器公钥+盐值16B双方计算共享密钥shared,经HKDF-SHA256抽出三把钥匙:up_key:客户端上行加密