"深入理解typescript的SSL/TLS协议以及OpenSSL编程实践"
在SSL/TLS协议中,密钥管理是保障通信安全的关键环节。本文将详细探讨SSL中的密钥信息,包括预主密钥、主密钥、对称密钥和MAC密钥的生成过程,以及SESSION信息的管理。
1. 预主密钥(Pre-Master Secret)
预主密钥是主密钥的生成基础,由客户端生成。在SSLv3中,这个过程发生在`ssl3_send_client_key_exchange`函数中,客户端使用服务器的公钥对一个随机生成的预主密钥进行加密,然后发送给服务器。这确保了即使在网络中被截取,攻击者也无法解密预主密钥,因为缺乏私钥。
2. 主密钥(Master Secret)
主密钥由预主密钥、客户端随机数和服务器随机数共同计算得出,确保了客户端和服务端生成的主密钥相同。在不同的SSL/TLS版本中,生成主密钥的函数有所不同,例如在SSv3中使用`ssl3_generate_master_secret`,而在TLSv1中使用`tls1_generate_master_secret`。主密钥存储在SESSION数据结构中,用于后续对称密钥和MAC密钥的生成。
3. 对称密钥和MAC密钥
对称密钥(包括初始化向量IV)以及读写MAC密钥都是基于主密钥、客户端随机数和服务端随机数生成的。在SSLv3中,这些密钥的生成位于`ssl3_generate_key_block`函数中,而分配则在`ssl3_change_cipher_state`中进行。对称密钥用于加密和解密数据,MAC密钥用于生成消息认证码,以验证消息的完整性和来源。
4. SESSION
当客户端和服务端建立新的SESSION时,服务器会生成一个唯一的SESSION ID,并通过哈希表缓存SESSION信息,然后在Server Hello消息中发送给客户端。此ID在SSLv2中是16字节,而在SSLv3和TLSv1中扩展到32字节。客户端在请求SESSION重用时,会在Client Hello消息中携带此ID,允许服务器查找并恢复先前的会话状态,从而提高连接速度。
关于OpenSSL编程,赵春平在《江南计算技术研究所》中提到,他通过替换Globus中的openssl实现,深入理解了openssl的底层机制,包括对称算法和非对称算法。他强调了学习openssl过程中遇到的挑战,以及编写书籍来记录和分享这些知识的重要性。书中详细介绍了如何使用openssl进行asn1模块的剥离,以及如何通过编写和调试程序来学习openssl的各种函数。
通过以上内容,我们可以了解到SSL/TLS协议中的密钥管理和OpenSSL编程的基本概念,这对于理解和实现安全网络通信至关重要。同时,赵春平的经历也提醒我们,持续学习和实践对于专业技能的提升是不可或缺的。