V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
finian
V2EX  ›  DevOps

服务端如何靠谱地保存密钥?

  •  
  •   finian · 2013-07-13 11:21:08 +08:00 · 8776 次点击
    这是一个创建于 3937 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据库中存有敏感信息,需要在存入时加密,取出时解密。采用对称加密算法,为了防止服务器被拿下导致密钥泄密,密钥如何保存和管理比较靠谱?
    第 1 条附言  ·  2013-07-13 13:13:36 +08:00
    补充一个场景,服务端需要用到敏感信息原文做一些操作,所以在客户端加解密的方案就用不了了
    17 条回复    1970-01-01 08:00:00 +08:00
    finian
        1
    finian  
    OP
       2013-07-13 11:42:48 +08:00
    自己想到的,不知是否靠谱:
    * 将密钥内容硬编进服务端程序逻辑(二进制)?
    * 将密钥放进加密容器,程序获取时输入密码?
    * 放到内网另外一台主机,通过安全通道获取?

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

    用“另一台电脑”当然也可以,不过“另一台电脑”靠不靠谱就另说了。
    kuphrer
        15
    kuphrer  
       2013-07-14 00:36:20 +08:00
    总之把加解密代理出去,只拿结果就对了
    vibbow
        16
    vibbow  
       2013-07-14 23:46:47 +08:00
    用 TPM ?
    dndx
        17
    dndx  
       2013-07-14 23:49:06 +08:00
    LZ 你需要的是硬件加密机。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1105 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:48 · PVG 02:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.