System entropy source not available 答疑

 在制作生成LMDB格式的时候   会出现这种情况(在训练开始的时候也会显示这个)System entropy source not available

挖掘了很久才知道这个秘密。

System entropy source not available意思是,没法使用系统熵池里面提供的随机数发生器,而是使用算法产生的伪随机数发生器产生随机数。当你在打乱数据的顺序时,使用的随机数不是系统内的。暂时写到这里,后续更新

<think>好的,我现在需要解决用户关于mbedtls_entropy_add_source函数的问题。用户想了解它的用法、示例、参数说明以及官方文档的信息。首先,我应该回忆一下自己对这个函数的了解,或者查阅相关资料。 根据用户提供的引用内容,知道mbedtls/entropy.h头文件涉及熵源相关功能,而mbedtls_entropy_add_source函数应该是用来添加自定义熵源的。接下来,我需要确认函数的参数和用法是否正确。 首先,函数的原型应该是这样的: int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, mbedtls_entropy_f_source_ptr f_source, void *p_source, size_t threshold, int strong ); 参数方面,ctx是熵上下文,f_source是回调函数,p_source是传递给回调的参数,threshold是触发收集的最小阈值,strong表示源是否强熵。这些是否正确?可能需要参考官方文档确认。 然后,用户可能需要一个示例代码。例如,如何定义一个熵源回调函数,并将其添加到上下文中。回调函数需要符合特定的格式,比如返回0成功,其他失败,并且填充数据。 参数说明需要详细解释每个参数的作用,比如threshold决定了何时调用该源,strong标志是否被认为是高熵源。这部分要确保准确,避免误导用户。 关于官方文档,用户可能希望得到链接或具体章节指引。但考虑到用户可能无法访问外部链接,应该建议他们查看Mbed TLS源码中的entropy.h头文件,或者在线文档的对应部分,比如Entropy Accumulation模块。 可能需要注意的问题包括:如何正确初始化熵上下文,如何确保回调函数的安全性和正确性,以及threshold的设置对性能的影响。此外,strong参数的设置对整体熵的评估是否重要。 用户的问题还可能涉及错误处理,比如函数返回的错误码有哪些,常见的错误有哪些,如何调试。例如,如果添加源失败,可能返回MBEDTLS_ERR_ENTROPY_MAX_SOURCES,说明已达到最大源数量限制。 还需要提醒用户,在添加自定义熵源后,必须正确使用熵上下文,比如通过mbedtls_ctr_drbg_seed来初始化随机数生成器。这能帮助用户将熵源与实际的随机数生成连接起来。 最后,生成的相关问题可能涉及如何测试自定义熵源的有效性,如何选择threshold值,或者如何组合多个熵源以提高安全性。同时,可能还需要说明在嵌入式系统中添加硬件熵源的实际案例。</think>### `mbedtls_entropy_add_source` 函数详解 #### 函数作用 `mbedtls_entropy_add_source` 用于向 MbedTLS 的熵池(Entropy Pool)中添加自定义熵源,以增强随机数生成的可靠性和安全性。熵源可以是硬件随机数生成器、传感器噪声等[^1][^2]。 --- #### 函数原型 ```c int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, // 熵上下文对象 mbedtls_entropy_f_source_ptr f_source, // 熵源回调函数 void *p_source, // 传递给回调函数的参数 size_t threshold, // 触发熵收集的最小阈值(单位:字节) int strong // 标记是否为强熵源(0=弱,1=强) ); ``` --- #### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | `ctx` | `mbedtls_entropy_context *` | 已初始化的熵上下文,通过 `mbedtls_entropy_init` 创建 | | `f_source` | `mbedtls_entropy_f_source_ptr` | 回调函数,需实现熵数据的采集逻辑 | | `p_source` | `void *` | 用户自定义指针,传递给回调函数(如硬件设备句柄) | | `threshold` | `size_t` | 当熵池中剩余熵低于此值时触发回调函数采集数据 | | `strong` | `int` | 标记熵源强度:`1` 表示强熵(不可预测),`0` 表示弱熵(可预测) | --- #### 回调函数定义 回调函数需符合以下格式: ```c int entropy_source_callback(void *data, unsigned char *output, size_t len, size_t *olen) { // data: p_source 参数传递的指针 // output: 填充熵数据的缓冲区 // len: 请求的熵数据长度 // olen: 实际写入的熵数据长度(需设置) *olen = 0; // 实现熵采集逻辑(如读取硬件熵源) // 返回 0 表示成功,非 0 表示失败 return 0; } ``` --- #### 使用示例 ```c #include "mbedtls/entropy.h" // 自定义熵源回调函数 int my_entropy_source(void *data, unsigned char *output, size_t len, size_t *olen) { // 假设从硬件源读取熵数据 if (read_hardware_entropy(output, len) == SUCCESS) { *olen = len; return 0; } *olen = 0; return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; } int main() { mbedtls_entropy_context ctx; mbedtls_entropy_init(&ctx); // 添加自定义熵源(阈值=32字节,强熵) int ret = mbedtls_entropy_add_source( &ctx, my_entropy_source, NULL, // 无额外参数传递 32, // 当熵池剩余量 <32B 时触发采集 1 // 标记为强熵源 ); if (ret != 0) { // 错误处理(如返回码 MBEDTLS_ERR_ENTROPY_MAX_SOURCES 表示超过最大源数量) } // 使用熵上下文初始化随机数生成器 mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &ctx, NULL, 0); // 清理资源 mbedtls_entropy_free(&ctx); mbedtls_ctr_drbg_free(&ctr_drbg); return 0; } ``` --- #### 官方文档指引 1. **头文件**:`mbedtls/entropy.h` [^1] 2. **关键说明**: - 最多支持 `MBEDTLS_ENTROPY_MAX_SOURCES` 个熵源(默认值:20) - 强熵源(`strong=1`)会被优先使用以提高安全性 - 需在调用 `mbedtls_entropy_func` 前完成所有熵源的添加 3. **返回码**: - `0`: 成功 - `MBEDTLS_ERR_ENTROPY_MAX_SOURCES`: 超过最大熵源数量 - `MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED`: 未定义任何熵源 --- #### 注意事项 1. **硬件熵源集成**:在嵌入式系统中,建议添加硬件熵源(如RNG外设)以提高安全性。 2. **阈值选择**:较小的 `threshold` 会导致频繁调用回调函数,可能影响性能。 3. **强弱熵源搭配**:混合使用强弱熵源可平衡安全性与效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值