【问题标题】:How to encrypt data using Botan library and a specific cipher suite?如何使用 Botan 库和特定密码套件加密数据?
【发布时间】:2019-12-23 19:20:12
【问题描述】:

我曾使用Botan::TLS::CallbacksBotan::TLS::Client Botan::TLS::Server 来获得客户端和服务器之间的安全通道。此外,为了加密-解密数据,我使用了 <botan/pubkeys.h> <botan/pk_keys.h> 和 Botan 库中的其他包含头文件。

我的问题是:

  1. 为什么Botan::PK_Encryptor_EME 对象没有在 Server_Hello_Message 中作为 密码套件 在双方之间协商加密算法。他们只需将公钥、随机数生成器和最佳加密填充算法作为输入。提到算法没有被明显和真实的密钥所采用(算法是指像AES-128这样的批量加密算法)。

  2. 如何保护 tls 通道?正如我通过源代码发现的那样,有一个函数Botan::TLS::Callbacks tls_emit_data(const uint8_t[], size_t) 将通过安全通道发送数据!即使客户端和服务器之前已经协商和交换了非对称密钥,也应该使用双方同意的对称密钥对数据进行加密。

【问题讨论】:

    标签: c++ ssl network-programming botan


    【解决方案1】:

    Botan::TLS::Client / Botan::TLS::Server 类实现 TLS 协议操作。具体来说,他们为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由你来实现。

    在典型的实现中,在建立连接后,您会调用client.send(buf, len) 并带有一些您想要发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的 tls_emit_data 回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将侦听套接字并读取此 TLS 记录。然后您将其传递给server.received_data(buf, len)。服务器在内部从 TLS 记录中提取实际数据,并通过 tls_record_received 回调将其提供给您。

    更多详情请见Botan API documentation

    关于您的问题:

    1. 我不确定您指的是代码的哪一部分。我可以在 Botan tls 模块中找到 PK_Encryptor_EME 的唯一用法是客户端密钥交换期间的 here。密钥交换不涉及使用用于传输数据的分组密码进行加密。发生这种情况,例如here

    2. tls_emit_data 将在客户端/服务器构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。

    示例实现

    Botan 包含一个基本 TLS 客户端/服务器的示例实现:tls_servertls_client

    这可以通过Botan命令行界面进行测试:

    • 生成 CA 证书:
    $ mkdir certdir
    $ botan keygen > ca_key.pem
    $ botan gen_self_signed --ca ca_key.pem my_root_authority > certdir/ca_cert.pem
    
    • 生成服务器证书:
    $ botan keygen > server_key.pem
    $ botan gen_pkcs10 server_key.pem localhost > server_csr.pem
    $ botan sign_cert certdir/ca_cert.pem ca_key.pem server_csr.pem > server_cert.pem
    
    • 启动 TLS 服务器(可能需要特权用户):
    # botan tls_server server_cert.pem server_key.pem
    
    • 启动 TLS 客户端:
    $ botan tls_client localhost --trusted-cas=certdir
    Certificate validation status: Verified
    Handshake complete, TLS v1.2 using CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256
    Session ID ...
    

    示例代码中的一些兴趣点:

    • Botan::TLS::Client 被创建 hereBotan::TLS::Server 被创建 here
    • Botan::TLS::Policy 可用于限制,例如可以使用哪些 TLS 版本和密码模式:Link
    • 客户端从标准输入here获取数据。它在内部构造 TLS 记录并将它们传递给 tls_emit_data 回调,定义 here 用于将 TLS 记录写入套接字。
    • 从套接字读取 TLS 记录并传递给服务器 here
    • 服务器内部从 TLS 记录中提取数据并将其传递给tls_record_receivedhere

    【讨论】:

      最近更新 更多