赞
踩
要用到openssl产生的随机数, 查了资料.
如果用命令行产生随机数, 如下:
openssl rand -hex -num 6
48bfd3a64f54
单步跟进去, 看到主要就是调用了一个RAND_bytes(), 没其他了.
官方说, 这个函数不一定会成功, 所以一定要判断返回值是否为1.
看openssl实现可知, openssl可以产生任意长度的随机数.
不用特意初始化随机数, 只要将openssl默认的初始化函数都调用到就行. e.g. 程序入口处调用自己总的openssl初始化函数.
void mem_hook() { int i_rc = 0; uint64_t u64_init_opt = 0; // 如果不需要检查openssl的内存泄漏, 就注释掉下面2行的内存分配函数的hook. // CRYPTO_get_mem_functions(&malloc_fn_org, &realloc_fn_org, &free_fn_org); // CRYPTO_set_mem_functions(my_CRYPTO_malloc, my_CRYPTO_realloc, my_CRYPTO_free); // openssl init all OPENSSL_INIT_SETTINGS* _ossl_init_setting = OPENSSL_INIT_new(); u64_init_opt = OPENSSL_INIT_LOAD_CRYPTO_STRINGS | OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS | OPENSSL_INIT_LOAD_CONFIG | OPENSSL_INIT_ASYNC | OPENSSL_INIT_NO_ATEXIT; // 将openssl库中的静态初始化函数显势调用一下, 免得在我们手工调用API时(因为有些openssl对象或变量没初始化)自动调用静态初始化函数引起多余的非我们应用产生的内存分配 // 初始化函数在应用中只能调用一次. i_rc = OPENSSL_init_crypto(u64_init_opt, _ossl_init_setting); assert(1 == i_rc); }
void my_openssl_app() { UCHAR szBuf[16*2 - 3]; int i_rc = 0; i_rc = RAND_bytes(szBuf, (int)sizeof(szBuf)); // 产生随机数, 就这一句. assert(1 == i_rc); // 一定要判断返回值是否为1(官方文档这么说) BIO_dump_fp(stdout, szBuf, sizeof(szBuf)); /*! run result 0000 - b8 8c c7 76 12 fb 41 e8-5b 6a 7d f0 9e 45 26 8a ...v..A.[j}..E&. 0010 - 43 f8 9f 8e ef e8 49 43-d0 db 8b 87 30 C.....IC....0 free map, g_mem_hook_map.size() = 0 */ }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。