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