- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 OpenSSL,我想从 session 中提取我的 HMAC key 和 AES key ,以便我可以在应用程序中使用 GPU 加速 HMAC 和 AES 加密。
SSL_accept
之后我在哪里可以得到 key ?AES key 是否存储在 SSLHandle->enc_write_ctx->cipher_data
中?HMAC key 存储在哪里?
最佳答案
如果您有名为 ssl
的 SSL*
,则查看 ssl->session
以获取主 key 和 ssl->s3
表示当前的 hamc key 。
ssl.h
有一个struct ssl_session_st
,也就是上面的ssl->session
。主 key 存储在 struct ssl_session_st
中。
struct ssl_session_st
{
int ssl_version; /* what ssl version session info is
* being kept in here? */
/* only really used in SSLv2 */
unsigned int key_arg_length;
unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH];
int master_key_length;
unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
...
}
继续进行一些推导,例如,您可以在 s3_clnt.c
中看到它。 SSL2 使用两个 session key - 每个方向一个(客户端到服务器;服务器到客户端)。 key 用于隐私和完整性保护。 SSLv3 及更高版本使用 6 个 key - 每个方向三个(客户端到服务器;服务器到客户端)。一个 key 用于隐私,第二个用于完整性,第三个用作随机数或 iv。
要查看 HMAC key 是什么,请查看 s3_enc.c
中的 n_ssl3_mac
大约第 700 行。您将看到如下内容:
int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
{
SSL3_RECORD *rec;
unsigned char *mac_sec,*seq;
EVP_MD_CTX md_ctx;
...
if (send)
{
rec= &(ssl->s3->wrec);
mac_sec= &(ssl->s3->write_mac_secret[0]);
seq= &(ssl->s3->write_sequence[0]);
hash=ssl->write_hash;
}
else
{
rec= &(ssl->s3->rrec);
mac_sec= &(ssl->s3->read_mac_secret[0]);
seq= &(ssl->s3->read_sequence[0]);
hash=ssl->read_hash;
}
...
TLS 还使用 ssl->s3
成员。例如,从 t1_enc.c
第 445 行开始:
mac_secret= &(s->s3->write_mac_secret[0]);
mac_secret_size = &(s->s3->write_mac_secret_size);
您还可以使用 BIO
或 通过
。SSL_SESSION_print
仔细查看 SSL*
对象中的数据>SSL_SESSION_print_fp
关于openssl - 如何在 OpenSSL 中获取 HMAC key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150124/
我是一名优秀的程序员,十分优秀!