日常积累

vc静态全局变量和普通全局变量
最近写一个项目时一个源文件用使用了全局的静态变量,在另一个源文件 extern 的时候却出现了错误。查了下资料,原来两者还是有区别的:
1):普通全局变量一般编译器会自动初始化,而静态全局变量不会初始化(所以才有了静态变量值初始化1次)。
2):普通全局变量的作用域可以是多个源文件,其他源文件中只要extern 申明一下就可以共享这个全局变量了;   而静态全局变量的作用域只能限定到当前文件了。
3):利用静态变量作用域的限定,可以防止多个文件多次重复申明全局变量。


openssl 生成rsa密钥对
要生成密钥对,首先要编译openssl。编译的问题先不说了。
首先利用openssl生成私钥:
进入out32目录,输入命令openssl genrsa -out private.key 1024
回车以后在out32目录下看到private.key 密钥已经生成。但有个警告:类似于这样,“warning can't open config file :/usr/local/ssl/openssl.cnf“,警告看起来总舒服。这是因为系统没有找到openssl.cnf 配置文件。恰好我的当前目录下有次文件。所以解决办法有了 继续输命令:set openssl_conf=E:\openssl-1.0.1s\out32/openssl.cnf 回车。
好了,警告取消了。删除掉刚才的密钥,重新生成一次,
私钥:openssl genrsa -out private.key 1024
成功以后,生成公钥:openssl rsa -in private.key -pubout -out public.key
这次没有任何警告了,一切都很顺利,生成的密钥都放在out32目录中了。此外还命令中2014表示私钥的长度, 还可以生成2048位的密钥,只需要把参数换一下即可。
相关链接:
https://www.openssl.org
http://stackoverflow.com/questions/16658038/cant-open-config-file-usr-local-ssl-openssl-cnf-on-windows
http://blog.csdn.net/scape1989/article/details/18959657


命名管道,打开管道时,提示访问拒绝
对于利用管道通信的进程而言,管道的服务器端在创建管道实例的时候最后一个字段需要一个安全属性,当忽略时,系统自动认为是默认的安全属性。利用默认的安全属性建立的管道实例,就会出现一个问题:如果管道服务端的权限和管道客户端的权限一样的话,数据传输是没有问题的,但是如果管道服务端的权限比管道客户端的权限大的话,管道客户端调用CreateFile打开管道就会返回失败,错误代码为5(拒绝访问),解决这一问题就是要,修改默认的安全属性。这里给出一个示例:

 

PSECURITY_DESCRIPTOR lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
	if (NULL == lpSecurityDescriptor)
	{
		//log
		return 0;
	}

	InitializeSecurityDescriptor(lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
	bRet = SetSecurityDescriptorDacl(lpSecurityDescriptor, TRUE, NULL, TRUE);
	if (!bRet)
	{
		//log
		LocalFree(lpSecurityDescriptor);
		return 0;
	}

	SECURITY_ATTRIBUTES sec;
	sec.bInheritHandle = FALSE;
	sec.lpSecurityDescriptor = lpSecurityDescriptor;
	sec.nLength = sizeof(SECURITY_ATTRIBUTES);
	hPipe = CreateNamedPipeW(
		PIPENAME,
		PIPE_ACCESS_DUPLEX,
		PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
		PIPE_UNLIMITED_INSTANCES,
		BUFFER_SIZE_512,
		BUFFER_SIZE_512,
		0,
		&sec);
	if (INVALID_HANDLE_VALUE == hPipe)
	{
		printf("create pipe error code:(%d) \n", GetLastError());
		return 0;
	}
	LocalFree(lpSecurityDescriptor);

 

 其实windows有很多对象都有安全属性,比如event, mutex,file,pipe等等,都可以这样设置。
这里涉及到一个访问控制列表的问题(ACL),ACL包括DACL(任意访问控制列表)和SACL(系统访问控制列表)。DACL是由安全对象自己设置的,它规定了那些用户,组,可以访问该对象(其实就是ACE),SACL是受系统管理员控制的,具体可以用于对安全对象访问的一些审计。

 

posted on 2018-10-09 15:20  priarieNew  阅读(289)  评论(0编辑  收藏  举报

导航