1
finian OP 自己想到的,不知是否靠谱:
* 将密钥内容硬编进服务端程序逻辑(二进制)? * 将密钥放进加密容器,程序获取时输入密码? * 放到内网另外一台主机,通过安全通道获取? 另外,https中的私钥是否也需要进行类似的安全性保护? |
2
zhttty 2013-07-13 11:51:23 +08:00
直接使用pam模块吧。
|
3
raptor 2013-07-13 11:59:12 +08:00
只要服务器被拿下,必然有办法解密,至少可以从内存中获得密钥。
更安全的办法是数据存储和加解密在不同的服务器上,设法防止两个服务器被同时攻破。 或者干脆客户端加解密,每个客户端使用不同的密钥。 |
5
finian OP @raptor 在客户端加解密的话,服务端也需要保存和管理客户端的密钥信息吧?如果只保存在客户端,客户端卸载了,密钥就丢失了
|
6
Kid 2013-07-13 12:13:30 +08:00
Hardware security module...
|
7
zhttty 2013-07-13 12:31:47 +08:00
用户a..b..c..d...z自己掌握各自的一个自己设定的密钥如:$key
用户输入内容$contents=>客户端JS($key,对称加密)=>$keycontents $(key)=>客户端MD5($key)传输到服务端=>成为盐$salt $keycontents通过https传输到服务端 对称算法F($salt,$keycontents)=>存入数据库 解密的过程反过来。 用户的$key对入侵服务器的人来说是透明的,包括管理员本身也看不到数据存储的原内容。 |
8
raptor 2013-07-13 12:38:15 +08:00
@finian 难度当然大,但是人家既然有能力黑了你的服务器,再破解个内存密钥应该也就那么回事。
客户端可以通过设置一个密码把密钥加密以后放到服务端作备份,重装客户端的时候把密钥下载下来用户输入密码解密,如果用错误的密码解出的密钥自然也是错误的,拿这个密钥云解服务端的数据自然也是错误的,能过对解密后的数据进行校验就可以判断。 |
9
finian OP @zhttty 感谢回复,这种思路挺好的,但是一旦用户忘记密码(密钥),数据库中的信息就解不开了。另外我补充了一下问题,因为服务端需要用到敏感信息的原文,所以在客户端加解密的方案就用不了了。
|
10
xdeng 2013-07-13 17:17:38 +08:00
6楼说的方法不错啊 用硬件加密模块
|
11
raptor 2013-07-13 17:47:23 +08:00
这样的话,硬件加密的确是最好的办法,除非黑客能到服务器上把加密硬件给偷走。
|
12
julyclyde 2013-07-13 18:13:19 +08:00
但是加密狗的速度很成问题……
|
13
pubby 2013-07-13 18:27:38 +08:00
对这块不熟悉,不过用加密硬件。。。那用另一台电脑能否替代加密硬件的功能?
|
14
Kid 2013-07-14 00:24:25 +08:00
@julyclyde 其实速度这个问题好办。
HSM 可以只存储一个 Master Key (m),而数据(d) 用另外的 Encryption Key (k) 加密。 数据库中存储 encrypt_m(k) 和 encrypt_k(d)。 其实每项数据的 Encryption Key 可以完全不一样。 用“另一台电脑”当然也可以,不过“另一台电脑”靠不靠谱就另说了。 |
15
kuphrer 2013-07-14 00:36:20 +08:00
总之把加解密代理出去,只拿结果就对了
|
16
vibbow 2013-07-14 23:46:47 +08:00
用 TPM ?
|
17
dndx 2013-07-14 23:49:06 +08:00
LZ 你需要的是硬件加密机。
|