OpenSSL之内存用法

OpenSSL之内存用法,第1张

用户在使用内存时,容易犯的错误就是内存泄露。当用户调用内存分配和释放函数时,查找内存泄露比较麻烦。OpenSSL提供了内置的内存分配/释放函数。如果用户完全调用OpenSSL的内存分配和释放函数,可以方便的找到内存泄露点。OpenSSL分配内存时,在其内部维护一个内存分配哈希表,用于存放已经分配但未释放的内存信息。当用户申请内存分配时,在哈希表中添加此项信息,内存释放时删除该信息。当用户通过OpenSSL函数查找内存泄露点时,只需查询该哈希表即可。用户通过OpenSSL回调函数还能处理那些泄露的内存。

本文假设你已经安装好了OpenSSL,并且持有一份111的源码。

内存相关的头文件为cryptoh、源文件在crypto目录中,文件名模式为memc。

这个结构定义了内存块的分配信息。主要字段含义:

addr —— 分配的内存地址。

num —— 分配的内存大小。

file —— 分配内存的文件名。

file —— 分配内存的行号。

threadid —— 分配内存的线程ID。

在111中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。

int CRYPTO_set_mem_functions(

void ( m) (size_t, const char , int),

void ( r) (void , size_t, const char , int),

void ( f) (void , const char , int));

成功返回1,失败返回0。

void CRYPTO_get_mem_functions(

void ( m) (size_t, const char , int),

void ( r) (void , size_t, const char , int),

void ( f) (void , const char , int));

这两个函数用于设置和读取与内存分配和释放相关的三个函数,这三个函数默认分别为:

static void ( malloc_impl)(size_t, const char , int) = CRYPTO_malloc;

static void ( realloc_impl)(void , size_t, const char , int) = CRYPTO_realloc;

static void ( free_impl)(void , const char , int) = CRYPTO_free;

这两个函数只允许在内存分配前即初使化时调用。

int CRYPTO_set_mem_debug(int flag);

设置是否开启内存调试。取值1或0,1表示打开。

成功返回1,失败返回0。

只允许在内存分配前即初使化时调用。

void CRYPTO_malloc(size_t num, const char file, int line);

void CRYPTO_zalloc(size_t num, const char file, int line);

void CRYPTO_realloc(void addr, size_t num, const char file, int line);

CRYPTO_free(void ptr, const char file, int line);

这几个函数用于分配和释放内存。

是否记录内存与CRYPTO_set_mem_debug()的开关有关。

int CRYPTO_mem_ctrl(int mode);

这个函数用于设置是否开启内存记录模式,参数取值为:

# define CRYPTO_MEM_CHECK_OFF 0x0

# define CRYPTO_MEM_CHECK_ON 0x1

返回旧模式。

注:我没有在头文件中看到像老版函数CRYPTO_is_mem_check_on()一样可以查询当前开关状态的用法,但是通过查看源码,发现可以对CRYPTO_mem_ctrl()传递一个不存在的类型(比如-1)使其返回当前状态。

int CRYPTO_mem_leaks_cb(int (cb) (const char str, size_t len, void u), void u);

遍历记录的内存,用于打印内存泄露信息。

返回是否有内存汇露。分别取值1和0。

int CRYPTO_mem_leaks(BIO bio);

打印内存泄露信息,输出到BIO中。

返回是否有内存汇露。分别取值1和0。

int CRYPTO_mem_leaks_fp(FILE );

CRYPTO_mem_leaks()的FILE版本。

由于OpenSSL内部涉及地数据结构众多,如果采用原始的内存操作函数,因为涉及到文件名和行号会比较麻烦。因此,OpenSSL定义了一组宏进行包装,方便使用者进行调用。定义如下:

下面这个例子演示了使用OpenSSl内存分配API进行操作。同时还用到了placement new()的用法,演示如何在openssl的内存分配串上创建c++对象。

如果在编译过程中出现下面这个错误:

testmemcpp:40:42: 错误:‘CRYPTO_mem_leaks_cb’在此作用域中尚未声明

CRYPTO_mem_leaks_cb(memleak_cb, "aaa");

解决办法是开启debug调试编译,命令如下:

/config --prefix=/usr/local/openssl enable-crypto-mdebug enable-crypto-mdebug-backtrace

输出:

old switch:0

@SNode::SNode name:[abc] age:[18]

@SNode::~SNode name:[abc] age:[0]

leak info:[[02:21:40] 1 file=testmemcpp, line=46, thread=140607514695488, number=36, address=0x204f090

]

##> /testmem() [0x4044e3]

##> /testmem(CRYPTO_malloc+0xa3) [0x4035e3]

##> /testmem() [0x40329c]

##> /lib64/libcso6(__libc_start_main+0xf5) [0x7fe1bbb77555]

##> /testmem() [0x4030f3]

leak info:[36 bytes leaked in 1 chunks

]

php怎么开启ssl开启ssl的方法资源

当访问启用SSL资源的时候,会出现\"did you forget to enable it when you configured PHP\"错误提示,从提示我们可以看出肯定是phpini中没有配置好SSL模块。(推荐学习:PHP编程从入门到精通)

打开phpini找到extension=php_openssldll,取消注释。

在PHP开启SSL的方法很简单,先找到phpini文件,将 extension=php_openssldll 前面的注释符号“;”去掉,然后重新启动apache就可以生效了!

有的朋友这样做却发现ssl没有生效,那么有个办法,就是将dlls文件夹里面的ssleay32dll和libeay32dll文件拷贝到C:WINDOWSsystem32 文件夹。

ssleay32dll

libeay32dll

php_openssldll那么如何判定ssl是否生效呢?

就要查看phpinfo了,写一个简单的phpinfo()测试程序,找到openssl这个位置,如果OpenSSL support是enabled就说明ssl已经开启。

基于默认配置文件(opensslconf)有稍作改动以便于使用

目录结构:

以下目录都是为了方便CA为用户颁发证书而建立:

其他目录都是依据opensslconf创建:

确认配置文件中ca相关信息(CA_default节)的正确

配置用户证书请求与CA颁发中用到的信息:用户信息(req_distinguished_name节)、通用名称(commonName)、备用名称(alt_names节)

opensslcnf用途:

opensslcnf文件中配置关系图(不支持这种语法):

如果出现了以上错误,则请修改opensslcnf中"[ policy_match ]"里的项:

一般用来增加证书备用名称

在opensslcnf中开启 req_extensions = v3_req,添加备用名称则修改[ alt_names ]节

命令行增加 "-extensions v3_req" 及[ alt_names ]节

增加备用名称,请修改以下内容:

自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信

如果你的规划需要创建多个证书,那么使用私有CA的方法比较合适,因为只要给所有的客户端都安装了CA的证书,那么以该证书签名过的证书,客户端都是信任的,也就是安装一次就够了

如果你直接用自签名证书,你需要给所有的客户端安装该证书才会被信任,如果你需要第二个证书,则还的挨个给所有的客户端安装证书2才会被信任。

参考: https://blogcsdnnet/u014721096/article/details/78571287

(打包是最好的,但是没有地方长存,不如就贴这里吧)

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/shuma/831735.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-10
下一篇2023-08-10

随机推荐

  • 秋冬有哪些好用的润唇膏推荐?

    润唇膏要说好用的,“补水、保湿、滋润”都是润唇膏最基础也是最重要的功效。个人觉得,好用的润唇膏成分是绝对安全的,不会添加防腐剂、色素、酒精、矿油精等有害物质。根据我在唇膏界摸滚打爬了七八年,好用的润唇膏有很多,但成分相对来说比较安全的真是少

    2024-04-15
    46100
  • 妮维雅美白身体乳怎么样?它真的能美白吗?

    妮维雅美白身体乳,真的是一款平价大碗的产品,不少妹纸是因为美白的原因购入,但是没有想到居然还很滋润,香味不是很浓郁,反正用起来不怕用量的一款身体乳妮维雅美白身体乳好用吗妮维雅美白身体乳,便宜大碗好用,一百分推荐。轻薄的乳液状,吸收快不粘腻,

    2024-04-15
    42300
  • 婴儿护肤品

    「导读」 宝宝也是可以使用护肤品的,只是在产品的选择上需要更加的谨慎而已,需要保护好宝宝皮肤表面的酸性保护膜并且保持宝宝皮肤的水分平衡。婴儿护肤品是指专门针对婴幼儿敏感肌肤研制,用于婴幼儿日常清洁、保护肌肤、预防溼疹、预防痱子等护理的产品。

    2024-04-15
    49100
  • 去黑头哪个牌子好

    去黑头品牌消费指南黑头通常出现在颜面的额头、鼻子等部位,鼻头又是鼻子的重中之重,是人目光的落脚点之一,所以去黑头成为了很多美女们的烦恼,但是市面上这么多产品,那么,去黑头哪个牌子好?去黑头产品什么牌子好?去黑头品牌哪些地区分布的最多?哪里产

    2024-04-15
    18800
  • 肌底液和精华液的区别 肌底液和精华液哪个重要

    1 肌底液和精华液的区别主要有以下区别:功效不一样肌底液中含有大量的亲水又亲油的成分,能将护肤品中的水分以及油分分解,从而使其更容易被肌肤吸收,其主要的作用就是帮助打开肌肤的胃口,促进

    2024-04-15
    43700
  • 妮维雅在中国有多少家工厂

    妮维雅在中国有53家工厂。总部位于德国汉堡的bdf公司在全世界拥有79家分公司及53家授权制造公司。业务遍布欧洲,美洲及亚洲地区,员工近2万人。nivea是美国商业周刊评选的全球最具有商业价值的100个品牌之一,也是ac尼尔森市调公司评选的

    2024-04-15
    37600
  • 哪一款男士洗面奶具备控油美白的功效?妮维雅、欧兰雅、还是曼秀蕾敦?如题 谢谢了

    近年来,男士护肤品市场迅速发展,男士洗面奶也成为了男性日常护肤的重要产品之一。对于控油美白效果的男士洗面奶,妮维雅、欧兰雅和曼秀蕾敦都是备受瞩目的品牌。哪一款男士洗面奶具备控油美白的功效呢?让我们来看看妮维雅男士洗面奶。妮维雅一直以来都是大

    2024-04-15
    31900

发表评论

登录后才能评论
保存