当前位置: 首页 > news >正文

openssl使用哈希算法生成随机密钥

文章目录

  • 一、openssl中随机数函数
      • **OpenSSL 随机数函数概览**
        • 1. **核心随机数函数**
      • **常用函数详解**
        • 1. `RAND_bytes`
        • 2. `RAND_priv_bytes`
        • 3. `RAND_seed` 和 `RAND_add`
        • 4. `RAND_status`
      • **随机数生成器的熵池**
      • **常见用例**
      • **注意事项**
  • 二、使用哈希算法生成随机的密钥


一、openssl中随机数函数

OpenSSL 提供了一套功能强大的随机数生成函数,用于生成高质量的伪随机数。随机数在密码学中至关重要,广泛用于密钥生成、盐值生成、初始化向量 (IV) 等安全操作。


OpenSSL 随机数函数概览

1. 核心随机数函数
函数名称描述
RAND_bytes生成高质量的伪随机字节。
RAND_priv_bytes生成高质量伪随机字节,推荐用于对安全性要求更高的密钥生成。
RAND_pseudo_bytes生成伪随机字节(不保证是加密级别安全,已被弃用)。
RAND_seed手动为伪随机数生成器添加种子值。
RAND_add添加额外的熵(种子数据)到伪随机数生成器的池中。
RAND_status检查随机数生成器是否被正确初始化。
RAND_poll自动收集熵以初始化随机数生成器(由内部调用)。

常用函数详解

1. RAND_bytes
  • 作用:生成高质量的加密级别伪随机字节。

  • 函数原型

    int RAND_bytes(unsigned char *buf, int num);
    
    • buf:指向用于存储随机字节的缓冲区。
    • num:要生成的随机字节数。
    • 返回值
      • 成功返回 1
      • 如果随机数生成器未正确初始化,返回 0
  • 示例

    unsigned char random_bytes[16];
    if (RAND_bytes(random_bytes, sizeof(random_bytes)) == 1) {printf("生成的随机数:");for (int i = 0; i < sizeof(random_bytes); i++) {printf("%02x", random_bytes[i]);}printf("\n");
    } else {fprintf(stderr, "随机数生成失败!\n");
    }
    

2. RAND_priv_bytes
  • 作用:与 RAND_bytes 类似,但专为高安全性应用设计(如密钥生成)。可能在实现中增加额外的保护。
  • 函数原型
    int RAND_priv_bytes(unsigned char *buf, int num);
    
  • 使用方法与 RAND_bytes 一致。

3. RAND_seedRAND_add
  • 作用:为随机数生成器添加种子值或熵,增强其随机性。
    OpenSSL 的随机数生成器依赖熵池,通常会自动初始化,但可以通过这些函数手动添加种子数据。

  • 函数原型

    void RAND_seed(const void *buf, int num);
    void RAND_add(const void *buf, int num, double entropy);
    
    • buf:种子数据。
    • num:种子数据的字节数。
    • entropy:种子中估计的熵(单位是比特,范围 0 到 8*num)。
  • 示例

    unsigned char seed_data[] = {0x12, 0x34, 0x56, 0x78};
    RAND_seed(seed_data, sizeof(seed_data));
    

4. RAND_status
  • 作用:检查随机数生成器是否被正确初始化。

  • 函数原型

    int RAND_status(void);
    
    • 返回值
      • 如果熵池已初始化且可用随机性足够,返回 1
      • 否则返回 0
  • 示例

    if (RAND_status() == 1) {printf("随机数生成器已初始化!\n");
    } else {printf("随机数生成器未初始化!\n");
    }
    

随机数生成器的熵池

OpenSSL 的随机数生成器使用熵池作为随机性的来源,依赖于系统提供的随机性(如 /dev/random/dev/urandom)。在大多数情况下,OpenSSL 会自动处理熵池的初始化,但开发者可以通过 RAND_seedRAND_add 提供额外的种子数据。


常见用例

  1. 生成随机密钥

    unsigned char key[32]; // 256 位密钥
    if (RAND_bytes(key, sizeof(key)) == 1) {printf("密钥生成成功!\n");
    }
    
  2. 生成随机初始化向量 (IV)

    unsigned char iv[16]; // 128 位 IV
    if (RAND_bytes(iv, sizeof(iv)) == 1) {printf("IV 生成成功!\n");
    }
    
  3. 增强随机数生成器熵

    unsigned char extra_entropy[] = {0xde, 0xad, 0xbe, 0xef};
    RAND_add(extra_entropy, sizeof(extra_entropy), 4.0); // 添加 4 比特熵
    

注意事项

  1. 使用 RAND_bytesRAND_priv_bytes

    • 推荐使用这两个函数生成随机数,因为它们提供加密级别的安全性。
    • 不建议使用 RAND_pseudo_bytes,因为它已被弃用。
  2. 熵的重要性

    • 高质量的熵是随机数生成的核心。如果熵不足,生成的随机数可能会被预测,降低安全性。
  3. 平台依赖

    • OpenSSL 的随机数生成器在不同平台上依赖系统的熵源,例如 /dev/urandom 或 Windows 的 CryptGenRandom。

OpenSSL 的随机数生成函数设计灵活,满足了从简单随机需求到高安全性应用的各种场景。如果需要更高安全性的随机数生成,推荐使用 RAND_priv_bytes

二、使用哈希算法生成随机的密钥

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rand.h>
#include <openssl/evp.h>#define SEED_LENGTH 32  // 随机种子长度(32 字节 = 256 位)
#define KEY_LENGTH 32   // 密钥长度(32 字节 = 256 位)// 使用随机种子和哈希算法生成密钥
void generate_hashed_key(unsigned char *key, size_t key_length) {unsigned char seed[SEED_LENGTH]; // 随机种子// 生成随机种子if (!RAND_bytes(seed, sizeof(seed))) {fprintf(stderr, "随机种子生成失败!\n");exit(EXIT_FAILURE);}// 打印随机种子(调试用)printf("随机种子: ");for (size_t i = 0; i < sizeof(seed); i++) {printf("%02x", seed[i]);}printf("\n");// 使用 SHA-256 哈希函数对种子进行散列EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); // 创建哈希上下文if (!mdctx) {fprintf(stderr, "创建哈希上下文失败!\n");exit(EXIT_FAILURE);}// 初始化哈希计算(使用 SHA-256)if (EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL) != 1) {fprintf(stderr, "哈希初始化失败!\n");EVP_MD_CTX_free(mdctx);exit(EXIT_FAILURE);}// 提供数据进行哈希计算if (EVP_DigestUpdate(mdctx, seed, sizeof(seed)) != 1) {fprintf(stderr, "哈希更新失败!\n");EVP_MD_CTX_free(mdctx);exit(EXIT_FAILURE);}// 获取哈希结果unsigned char hash[EVP_MAX_MD_SIZE];unsigned int hash_len;if (EVP_DigestFinal_ex(mdctx, hash, &hash_len) != 1) {fprintf(stderr, "哈希计算失败!\n");EVP_MD_CTX_free(mdctx);exit(EXIT_FAILURE);}// 释放哈希上下文EVP_MD_CTX_free(mdctx);// 取哈希结果的前 key_length 字节作为密钥if (key_length > hash_len) {fprintf(stderr, "密钥长度超出哈希值长度!\n");exit(EXIT_FAILURE);}memcpy(key, hash, key_length);// 打印生成的密钥(调试用)printf("生成的密钥: ");for (size_t i = 0; i < key_length; i++) {printf("%02x", key[i]);}printf("\n");
}int main() {unsigned char key[KEY_LENGTH]; // 存储生成的密钥// 调用密钥生成函数generate_hashed_key(key, KEY_LENGTH);return 0;
}

运行两次的结果:

这里可以看到每次运行后生成的密钥都是不一样的,这样就保证了密钥的不一致性。
在这里插入图片描述

相关文章:

openssl使用哈希算法生成随机密钥

文章目录 一、openssl中随机数函数**OpenSSL 随机数函数概览**1. **核心随机数函数** **常用函数详解**1. RAND_bytes2. RAND_priv_bytes3. RAND_seed 和 RAND_add4. RAND_status **随机数生成器的熵池****常见用例****注意事项** 二、使用哈希算法生成随机的密钥 一、openssl中…...

将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式

文章目录 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式MathType安装问题MathType30天试用延期MathPage.wll文件找不到问题 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式 word自带公式编辑器编辑的公式格式&#xff1a; MathType编辑的格式&a…...

校园失物招领系统基于 SpringBoot:点亮校园归还遗失物之光

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…...

dhcpd服务器的配置与管理(超详细!!!)

前提条件&#xff1a; &#xff08;1&#xff09;虚拟机能够联网&#xff08;如果nat模式不能联网的看另一期&#xff09; CentOS7 NAT模式不能联网-CSDN博客 &#xff08;2&#xff09;系统是Centos8&#xff0c;因为下载的dhcp-server软件包版本和Centos7不匹配,如果你能成…...

Qml之基本控件

一.Qml常用控件 1.Text(显示普通文本和富文本) 1.1显示普通文本&#xff1a; Window { visible: true width: 320 height: 240 title: qsTr("Hello World") Text { text: "Hello World!" font.family: "Helvetica" font.pointSize: 24 color:…...

【Java从入门到放弃 之 Stream API】

Java Stream API Stream API行为参数化传递代码Lambda表达式Lambda 表达式的语法方法引用 Lambda 表达式的实际应用集合操作并发编程 Lambda 表达式的注意事项总结 Stream API Java8提供了一个全新的API - Stream。引入这个Stream的主要目的&#xff0c;一个是可以支持更好的并…...

Ruby On Rails 笔记1——Rails 入门

突然想跟着官方文档把Ruby On Rails过一遍&#xff0c;把一些有用的记下来就可以一直看了&#xff0c;do它! https://guides.rubyonrails.org/v7.2/ 注&#xff1a;官网是英文文档&#xff0c;我自己翻译了一下&#xff0c;不确保完全准确&#xff0c;只供自己学习开发使用。 …...

高效开发 Python Web 应用:FastAPI 数据验证与响应体设计

高效开发 Python Web 应用&#xff1a;FastAPI 数据验证与响应体设计 目录 &#x1f9d1;‍&#x1f4bb; FastAPI 的数据验证系统与 Pydantic 模型&#x1f4e6; 响应体与模型&#xff1a;定义响应数据的最佳实践&#x1f504; 响应模型与查询参数的结合&#xff1a;增强灵活…...

基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计

摘要&#xff1a;在数字化商业浪潮席卷之下&#xff0c;实体门店面临着激烈的市场竞争&#xff0c;如何高效拉新成为关乎门店生存与发展的关键问题。本文聚焦于“开源 21 链动 O2O 商城小程序”&#xff0c;深入探讨结合多种手段的门店拉新策略及详细流程设计。通过剖析到店扫码…...

33.5 remote实战项目之设计prometheus数据源的结构

本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…...

微服务springboot详细解析(一)

目录 1.Spring概述 2.什么是SpringBoot&#xff1f; 3.第一个SpringBoot程序 4.配置参数优先级 5.springboot自动装配原理 6.SpringBootApplication&SpringApplication.run 7.ConfigurationProperties(prefix "") 8.Validated数据校验 29、聊聊该如何写一…...

深入探讨Go语言中的双向链表

简介 双向链表是链表家族中的一种高级结构&#xff0c;每个节点不仅指向下一个节点&#xff0c;还指向上一个节点。今天&#xff0c;我们将学习如何在Go语言中实现和操作这种灵活的数据结构。 双向链表的优缺点 优点&#xff1a; 可以从任一方向遍历链表&#xff0c;灵活性高…...

Fastapi + vue3 自动化测试平台---移动端App自动化篇

概述 好久写文章了&#xff0c;专注于新框架&#xff0c;新UI界面的实践&#xff0c;废话不多说&#xff0c;开搞 技术架构 后端&#xff1a; Fastapi Airtest multiprocessing 前端&#xff1a; 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…...

ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词

1.将用户访问记录表数据同步到ES&#xff0c;并且分词&#xff0c;获取用户访问最多前十条词语。 Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot 使用结巴分词器 <!-- 分词器--><dependency><groupId>com.hua…...

在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录

介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中&#xff0c;集成 Serilog 作为记录请求和响应&#xff08;包括传入和传出的数据&#xff09;的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...

2024年顶级小型语言模型前15名

本文&#xff0c;我们将深入了解2024年备受瞩目的十五款小型语言模型&#xff08;SLMs&#xff09;&#xff0c;它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称&#xff0c;它们不需要依赖庞大的服务器资源&#xff0c…...

精通 Python 网络安全(一)

前言 最近&#xff0c;Python 开始受到越来越多的关注&#xff0c;最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检测和利用漏洞&#xff0c;并解决网络挑战。 本书将首先带您了解与网络和安全相关的 Python 脚本和库。然后&…...

【python自动化二】pytest集成allure生成测试报告

pytest本身不会直接生成测试报告&#xff0c;而allure是一种生成测试报告的公共插件&#xff0c;可与多种测试框架配合生成测试报告&#xff0c;本文介绍下如何集成allure生成测试报告。 1.allure安装 1.安装allure-pytest 先安装allure的pytest插件&#xff0c;用于在pytes…...

网络版本的通讯录青春版(protobuf)

环境搭建 Protobuf 还常⽤于通讯协议、服务端数据交换场景。 因为我们主要目的只是为了学习protobuf&#xff0c;因此对于客户端&#xff0c;原本应该具备&#xff1a; 新增⼀个联系⼈ ◦ 删除⼀个联系⼈ ◦ 查询通讯录列表 ◦ 查询⼀个联系⼈的详细信息 这样四个功能。 …...

开源模型应用落地-安全合规篇-用户输入价值观判断(三)

一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...