Chinaunix

标题: 当密码保存在内存里面时,是绝对安全的吧? [打印本页]

作者: fender0107401    时间: 2012-12-14 15:12
标题: 当密码保存在内存里面时,是绝对安全的吧?
比如我用一个字符串来保存密码(明文),打算后续使用这个密码去连接远程的数据库,这个时候会不会有安全问题呢?
作者: liuiang    时间: 2012-12-14 15:15
你的安全要达到什么程度?或者你想防止什么样的攻击?
作者: hellioncu    时间: 2012-12-14 15:16
不安全,人家可以访问你的进程的内存
作者: zimang    时间: 2012-12-14 15:24
回复 3# hellioncu


    这个比较难吧? 内存溢出?
作者: hellioncu    时间: 2012-12-14 15:30
zimang 发表于 2012-12-14 15:24
回复 3# hellioncu


windows下有API   ReadProcessMemory,Linux不知道,不过gdb总是可以的
作者: fender0107401    时间: 2012-12-14 15:38
hellioncu 发表于 2012-12-14 15:16
不安全,人家可以访问你的进程的内存


那该如何是好啊?
作者: hellioncu    时间: 2012-12-14 15:48
fender0107401 发表于 2012-12-14 15:38
那该如何是好啊?



常规的是校验密码的SHA-1之类算法的摘要值,一般数据库似乎没有提供这方面的支持,那只能这么做,尽量让密码存在的时间短,系统控制好权限一般没问题的。


作者: fender0107401    时间: 2012-12-14 15:54
回复 7# hellioncu

我想写个操作数据库的程序,就像是phpmyadmin那样可以管理mysql的,自然我需要用户输入用户名和密码去连接数据库了,所以这个程序肯定就需要保存密码的明文了,不过我感觉,让密码存在的时间尽量的短点倒是很好,我用root连接完数据库就干掉密码。
作者: shan_ghost    时间: 2012-12-14 15:57
不在内存保存密码……

一个可行的方案:在有数据库访问密码文件访问权的用户下执行启动和链接数据库操作;链接之后清除内存中的密码并放弃配置文件访问权(也就是切换成nobody之类用户提供服务)。如果数据库意外断开,则记录日志、发送信号并退出当前服务。

然后,再在有数据库访问密码文件访问权的用户下执行一个监控进程,发现上面提到的服务进程退出就再拉起一个……


因为监控进程根本就不对外服务;服务进程有权限访问密码时不对外服务且不属于nobody用户;然后等服务进程在对外服务时自己也没了访问敏感信息的权力:这样一来,只要服务器本身不在用户权限上出问题,就可以保证绝对安全。

当然,如果服务进程本身漏洞太多,那么nobody权限下,服务进程仍能访问的东西还是免不了要被黑的。但只要总体设计比较合理,这个危害范围就小得多了。
作者: taotao_112206_c    时间: 2012-12-14 16:42
问题可大了,人家可以直接访问你的内存,读出你的数据,在linux下这个是常用技术。进程间通信好好看看
作者: tempname2    时间: 2012-12-14 17:08
嗯,内存有可能会被swap出去。
作者: folklore    时间: 2012-12-14 18:11
为什么大家都说不安全,就我说安全?
如果保存在内存中不安全,那保存在什么地方都不安全。

读别的进程的内存,你先拿到权限先吧
作者: JohnBull    时间: 2012-12-14 18:56
安全是相对的,如果你放在内存里的数据某人能看见,那你放哪都没用的了,怎么样都是时间问题。
不用考虑这些。

程序员根本不需要花心思去防root搞你,因为你根本防不住。

作者: 一个人取暖    时间: 2012-12-14 19:06
JohnBull 发表于 2012-12-14 18:56
安全是相对的,如果你放在内存里的数据某人能看见,那你放哪都没用的了,怎么样都是时间问题。
不用考虑这 ...


对滴

在内存的数据, 对有访问权限的user来说, 比如 root, 那是没啥安全可言的.
作者: ecloud    时间: 2012-12-14 20:42
很老套的技术,怎么没人说?
密码乱序排列就行了,然后你当然自己记住这个顺序,别人只有反编译你得程序才知道你的顺序
以前很多DOS游戏的正版验证码和一些关键数据,都有这么干的,然后诸如FPE那些游戏修改工具就很头痛。有个游戏的钱数我从来都没改得了,据说就是乱序了
作者: fender0107401    时间: 2012-12-14 21:31
回复 15# ecloud



   
作者: fender0107401    时间: 2012-12-14 21:31
回复 13# JohnBull


   
作者: hellioncu    时间: 2012-12-14 21:31
ecloud 发表于 2012-12-14 20:42
很老套的技术,怎么没人说?
密码乱序排列就行了,然后你当然自己记住这个顺序,别人只有反编译你得程序才 ...


关键是LZ要拿这密码去连接数据库
作者: ecloud    时间: 2012-12-14 21:44
hellioncu 发表于 2012-12-14 21:31
关键是LZ要拿这密码去连接数据库

用的时候反算啊,enigma呗,最简单的就是乱序,复杂一点的就enigma,反正对方要是不反汇编你,也不知道你究竟是只是改了顺序要是做了替换
比如1-3,2-5,4-6对调,用的时候反回来。要是纯数字还可以做一些可以反算的数学运算啥的。以前还有种恶心的方法是高位取反以后往里面掺沙子,从第几位开始插一个E0,然后第几位再插个FE,内存跟踪程序基本就都傻眼了
作者: ecloud    时间: 2012-12-14 21:50
还有一种阴险的做法,我记得以前台湾哪个游戏厂家,大宇还是智冠来着
正版游戏都有一个密码表,让你输入第几页第几行。我曾经想像破解光荣游戏一样把他们都改成0000,结果无法在程序中找到任何一个表上的数!
后来有高人揭露,其实那个表上的那些8位数,其中第2位是根本不用的,你去找当然怎么都找不到,要把第一位和3-8位组合成一个7位数才是真正的密码
作者: hellioncu    时间: 2012-12-14 22:20
ecloud 发表于 2012-12-14 21:44
用的时候反算啊,enigma呗,最简单的就是乱序,复杂一点的就enigma,反正对方要是不反汇编你,也不知道你 ...


你传递密码给数据库连接API的时候,密码总得还原吧,在这里下断点,前面怎么玩花招都没用。

作者: selfrun    时间: 2012-12-14 22:26
如果木马程序能访问你的内存,那hook掉数据库接口的api岂不简单?怎么防
作者: tianlijian    时间: 2012-12-15 03:17
过来学习的
作者: ecloud    时间: 2012-12-17 14:05
hellioncu 发表于 2012-12-14 22:20
你传递密码给数据库连接API的时候,密码总得还原吧,在这里下断点,前面怎么玩花招都没用。

不要用任何临时变量存反算的结果,或者直接用寄存器变量,然后编译加参数强制试用寄存器。不过可能对某些编译器不适用
不过如果它都知道在哪里下断点截获你得数据库访问了,那其实已经反汇编了你的程序,那还折腾什么,直接投降了
作者: celise    时间: 2012-12-18 09:59
换硬件和操作系统吧,mainframe的z/os的内存是有保护加密的
作者: socay2    时间: 2012-12-18 12:37
taotao_112206_c 发表于 2012-12-14 16:42
问题可大了,人家可以直接访问你的内存,读出你的数据,在linux下这个是常用技术。进程间通信好好看看


可以随便访问其他的进程内容? 那种进程通信方式可以做到?
作者: socay2    时间: 2012-12-18 12:45
那个什么MD5加密算法,可以用不呢?
还有什么不可逆算法,我不清楚。
作者: cjaizss    时间: 2012-12-18 14:13
folklore 发表于 2012-12-14 18:11
为什么大家都说不安全,就我说安全?
如果保存在内存中不安全,那保存在什么地方都不安全。

挺你!妇科老人
作者: noword2k    时间: 2012-12-18 15:34
如果你要给对方可执行文件,对方就可以逆向(反汇编)、debug这些文件。

你想保护数据库密码是不可能的,拿到密码的方法多了去了。

最好的方法就是设置数据库的权限,让外露的账号保持可用的最小权限。
作者: wangyb    时间: 2012-12-19 10:38
每一步都有可能泄露自己的密码。
包括在连接数据库之前。
我见过通过更改本机的数据库连接的dll中的api,在你的程序连接数据库的时候,直接截获密码。
作者: Sevk    时间: 2012-12-19 12:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: xsniper001    时间: 2012-12-19 20:39
只要连接数据库的时候是明文,别人总可以搞到的,没有绝对安全,只有相对的,
减少密码在内存的时间,用加密总好一些。
作者: snow888    时间: 2012-12-21 20:30
fender0107401 发表于 2012-12-14 15:38
那该如何是好啊?


加密存放,程序启动的时候读出来,用私钥解密。
作者: sephirosh-    时间: 2012-12-22 22:46
没有绝对的安全的,只有相对的,就算是加密,如果要去获取你的,最多只是做和你同样的操作,照样可以连接,不一定要知道你的密码的明文,如果真的要相对的安全,那么每次连接的时候,先从远程获取密钥,之后这边再加密存放在内存,访问的时候用这个加密过的去访问,这样,每次启动,存在内存里面的密码都是不同的,可以达到相对的安全的效果,但是这种方式也并不是绝对安全的,可以拦截你的密钥之后,在根据的存储的加密过的内容进行解密,最终得出你的加密方式作出解密的工具,而最绝的就是直接反汇编你的加密算法,之后写出获取你内存的数据之后在解密的工具

总结,没有绝对的安全,只有更复杂的思路去反被解密或者监听
作者: KanonInD    时间: 2012-12-23 11:22
假定系统已被植入木马,就不能假定连接数据库的API没被木马改动过了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2