首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么才能防止别人从内存中读取数据

2012-05-27 
如何才能防止别人从内存中读取数据在做一个需要加密的东西,客户端从服务器接收密钥,先不考虑别人从网络上

如何才能防止别人从内存中读取数据
在做一个需要加密的东西,客户端从服务器接收密钥,先不考虑别人从网络上截取密钥,在客户端接收到密钥后,怎么才能防止他从内从中把密钥读取出来呢?从内从中读取数据都有哪些方法,分别应该怎么防止?

[解决办法]
先不说有那么多现成的 读取进程内存的软件,winHex 之类的
思路,不能放在阻止别人读你的内存这个上面


假设,你有最严密的方法,避免了人家读取内存。

可人家,用 VMware,virtualBox 之类的虚拟机。 然后,把整个 系统,suspend/snapshot到硬盘。 那么,你所有的内存,都存到了硬盘。 于是,也你再强硬的方法,最终就是 fopen/fread的干活了。

(就像那个经典的例子,有什么办法避免用户截屏截图? 最终答案,“试问LZ又如何防止用户拿相机对着屏幕拍”)

引用
zhao4zhong1
不要陷入加密与解密的死循环
[解决办法]
赵老师还有一句名言,是什么调用XX API还可以读取别的进程的信息呢
[解决办法]
还是加密,在使用的时候再还原。
[解决办法]

探讨

其实我并不想做这些事,只是领导觉得别人可以从内从读取密钥很不安全,但是又找不出更好的方案,所以让我写个报告上去,说明一下现在都有什么方式从内存获取密钥,有什么方法可以防止,评估一下安全级别

[解决办法]
加密是有时效性的,通常楼主说的这种情况不需要考虑防止别人从内存中把密钥读出来,这种密钥一般是一个session(会话,或者客户端和服务端每次建立连接)换一次,也就是所谓的session key,等到别人截获到session key的时候,就已经失效了。

当然,这不是足够安全的做法。足够安全的做法就是服务器端产生session key以后,是用PKI的方式来加密sessioin key的,PKI属于非对称加密,非常可靠但效率比较低,session key则是对称加密,效率比较高但安全性较差。用PKI的方式加密session key进行传输,就结合了这两者的优点,既可以保证session key的安全传输到通讯的另一端,然后正常的通讯又都是采用session key进行加解密这种对称的方式。

比如Server有一对密钥:PublicServer(公钥)/PrivateServer(私钥),Client也有一对密钥PublicClient(公钥)/PrivateClient(私钥),同时假定Server所产生的对称密钥是sessionKey,那么sessionKey的传输到Client的过程就是这样的:
1. 首先用PrivateServer加密sessionKey
2. 用PublicClient加密步骤1的结果
3. 发送
4. Client接收到后,首先用PrivateClient解密,得到步骤1的结果
5. 再用PublicServer解密步骤4得到的结果,就会得到sessionKey
-------------
6. 然后Client和Server就开始用sessionKey来进行对称方式的加解密了。
在传输的过程中,从理论上而言,几乎没有被破解的可能性。事实上网上银行的数据传输安全机制就是这样的。

当然安全是没有绝对的,一切都是相对的。
[解决办法]
探讨

其实我并不想做这些事,只是领导觉得别人可以从内从读取密钥很不安全,但是又找不出更好的方案,所以让我写个报告上去,说明一下现在都有什么方式从内存获取密钥,有什么方法可以防止,评估一下安全级别

[解决办法]
还是要做一下加密,这样相对安全一些。至于加密的复杂度要看信息的安全度。
[解决办法]
这个应该没办法。
密码也没有绝对的安全。
只是解密需要花费的时间不同罢了。
如果解密花销的费用大于解开密码所得的费用,大部分的人会放弃解密。
[解决办法]
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!

[解决办法]
参考API ReadProcessMemory
[解决办法]
仅供参考
C/C++ code
#include <stdio.h>FILE *fi,*fo;void main() {    fo=fopen("500M.out","wb");    fi=fopen("500M.in","rb");    fseek(fi,-1L,SEEK_END);    while (1) {        fputc(fgetc(fi)^0xA5,fo);        if (fseek(fi,-2,SEEK_CUR)) break;    }    fclose(fi);    fclose(fo);}
[解决办法]
哥是搞安全的,给你权威解释吧

楼主不要费劲了,软件算法必然有一段时间密钥是明文存在内存中的,技术手段只能够减少这个存在时间,比如加密后立即请利用过的堆栈

只有硬件加密(加密卡/usbkey等),密钥不出卡才能达到你的要求

软件加密必须默认本地内存的安全性,可以有一些小打小闹的安全增强手段,比如做成驱动,只有内核级进程和超级管理员权限才能访问你的内存之类,但都不能根本解决问题

楼主你们这个密钥管理机制是谁设计的,难道是网络上明文传输密钥,这个……也太菜了,远程密钥交换是由许多现成的协议的,网络上绝不能出现密钥明文

所以,“先不考虑别人从网络上截取密钥,在客户端接收到密钥后,怎么才能防止他从内从中把密钥读取出来”这是本末倒置的说法
[解决办法]
只要你的 数据在内存中,不管你是神马驱动啊,内核啊,权限啊。


全是浮云。


一个 vmware, virtual box 把 整个操作系统运行在 虚拟机中。


然后, 把虚拟机的整个内存,和状态等, suspend/snapshot ,到硬盘。
那么,你整个内存的数据,全在 硬盘上了,在host 机器,也只是 浮云般的 fopen fseek , fread, 什么驱动权限内核通通成了纸老虎。


所以,妄想别人不读你的内存,是不可能的。
[解决办法]
最后还是,防反向,防调试。

有些跑题了,lz的数据没那么高的密级,又不是卫星通信,没必要搞得这么严重吧,呵呵呵
[解决办法]
还是引入硬件加密吧,信息这种东西,要绝对防止复制,窃取比较难.
[解决办法]
对啊,是什么东西要求这么高

热点排行