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

话说回来,如何做才能在明文存储密码的情况下保证安全?

  •  
  •   whileFalse · 2018-03-07 08:45:59 +08:00 · 5569 次点击
    这是一个创建于 2235 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不考虑“这样做有什么意义”,只是矫情地想知道答案。比如:


    1.认证使用单独的服务和 DB,其他任何业务不连接该 DB
    2.认证服务做好防注入
    3.为防止密码被管理员看到用于尝试登录其他网站,密码不允许自己设定。在注册和更换密码时都自动生成随机密码
    第 1 条附言  ·  2018-03-07 16:17:51 +08:00
    我只是想搞清楚,在仅有“服务”和“ DB ”这个简化的系统里,DB 存明文,怎么保证安全。
    也就是说,在仅有服务有可能被攻破的情况下保证安全。服务所在的宿主机被从服务之外攻破,不在考虑范围。
    35 条回复    2018-03-08 11:21:27 +08:00
    kanex
        1
    kanex  
       2018-03-07 08:57:30 +08:00
    你的第三条已经和用哈希去 mask 没有本质差别了吧
    snail1988
        2
    snail1988  
       2018-03-07 08:59:08 +08:00
    随机密码不就和 hash 一样了,那明文密文还有什么区别?
    wysnylc
        3
    wysnylc  
       2018-03-07 08:59:29 +08:00
    明文==不安全
    XiaoFaye
        4
    XiaoFaye  
       2018-03-07 09:00:01 +08:00
    以前做过 SQL Server 数据库加密,应该是比较好的方法了。
    Keyes
        5
    Keyes  
       2018-03-07 09:13:36 +08:00
    之前我们也有类似的需求,某个核心功能必须要有明文密码,当前的解决方案是直接在 C 代码里硬编码了一个 AES 钥匙,对称加密存起来你懂的

    其实有更好的做法,我们是有 web 的,可以在登录 web 时把密码写一份到 cookie 里,再把 cookie 处理一下就可以了
    Keyes
        6
    Keyes  
       2018-03-07 09:14:18 +08:00
    接上,后边业务服务器还是存 hash,这样可以确保自身清白
    580a388da131
        7
    580a388da131  
       2018-03-07 09:20:17 +08:00
    服务器只要联网就一定能被攻破
    Keyes
        8
    Keyes  
       2018-03-07 09:22:26 +08:00
    @580a388da131 也不能单说一定会被攻破,要看攻破的代价
    Len1133
        9
    Len1133  
       2018-03-07 09:23:16 +08:00
    把明文藏起来
    fzleee
        10
    fzleee  
       2018-03-07 09:24:57 +08:00
    参看之前 Adode 密码泄漏事件。所有密码用 AES 加密,加密密钥放到其他地方。
    ssoor
        11
    ssoor  
       2018-03-07 09:25:09 +08:00
    有没有考虑过存双份, 明文和 hash 都存一份, 明文表线上只允许写权限.其他机制都是使用 hash.如果非要保留明文密码的话我觉得这样应该可以做到比较好的权限.但是限制也比较明显,就是存储系统必须支持,以及对存储系统的权限管理要做好避免存储系统方面出问题.
    whileFalse
        12
    whileFalse  
    OP
       2018-03-07 09:36:09 +08:00
    @snail1988 @kanex 有区别啊。看下密码表就可以登录。这么做的目的是防社工。防管理员拿着你的密码去别处碰。
    snail1988
        13
    snail1988  
       2018-03-07 09:38:13 +08:00
    @whileFalse 你非明文密码我拿到也可以登录啊,密码不明文储存本质目的就是避免撞库,拿着明文密码登录其他网站,你自己网站都被攻破了,你的密码已经没什么意义了
    iyaozhen
        14
    iyaozhen  
       2018-03-07 09:40:39 +08:00 via Android
    可以根据用户名生成 aeskey 加密。做模拟登录确实需要存储用户密码
    whileFalse
        15
    whileFalse  
    OP
       2018-03-07 09:42:43 +08:00
    @snail1988 在不修改程序的情况下,拿到不能反解的非明文密码,怎么登录呢?

    我们在讨论的不就是怎么不被攻破么。管理员查表看密码不视为网站被攻破。
    gamexg
        16
    gamexg  
       2018-03-07 09:45:56 +08:00 via Android
    离线生成公钥钥对,私钥离线保存。
    明文密码公钥加密后保存。
    xpresslink
        17
    xpresslink  
       2018-03-07 09:53:08 +08:00
    数据库加密之类的也是间接加密。

    明文要保证安全唯一办法就是,----物理隔离----,
    也就是说放了密码的主机不能连网,同时禁用任何外接存储,禁止任何非授权的人进入机房。
    要查询要在主机本地终端操作。不然谈安全都是扯淡。
    Building
        18
    Building  
       2018-03-07 10:01:06 +08:00 via iPhone
    用可逆的加密算法即可,前提是你的算法不会泄漏。
    otakustay
        19
    otakustay  
       2018-03-07 10:35:48 +08:00
    让密码仅短时间、一次性生效,对,说的就是短信验证码
    whileFalse
        20
    whileFalse  
    OP
       2018-03-07 10:42:14 +08:00
    @otakustay #19 短信验证码是基于手机的登录,不是基于密码体系的登录。
    IvanLi127
        21
    IvanLi127  
       2018-03-07 10:52:44 +08:00 via Android
    明文保存就得保证你的数据库绝对安全且有权读取数据库的用户也得是绝对可靠的,比如认证程序读取时不把密码带出去。还是加密加盐成本低
    xomix
        22
    xomix  
       2018-03-07 11:14:18 +08:00
    使用 RFC 4226 - HOTP 标准不要继续使用用户名密码标准。或者利用 HOTP 两部验证,这时候密码就是防止 HTOP 设备遗失用的钥匙,没有泄露风险。
    mengzhuo
        23
    mengzhuo  
       2018-03-07 14:58:17 +08:00
    @whileFalse #12 密码本被搞到的,然后战败的悲剧,在二战就已经上演了。

    任何能还原的密码都可以视为明文,就是不安全,不管你用什么法子变着方存。
    draguo
        24
    draguo  
       2018-03-07 15:25:38 +08:00
    你和那个国家图书馆用明文存储密码的是什么关系?
    whileFalse
        25
    whileFalse  
    OP
       2018-03-07 16:17:35 +08:00
    @mengzhuo 楼里面有很多说用 AES 存的,我可没说……
    我只是想搞清楚,在仅有“服务”和“ DB ”这个简化的系统里,DB 存明文,怎么保证安全。
    也就是说,在仅有服务有可能被攻破的情况下保证安全。服务所在的宿主机被从服务之外攻破,不在考虑范围。
    whileFalse
        26
    whileFalse  
    OP
       2018-03-07 16:18:43 +08:00
    @draguo 看到那帖有感而发。
    dcll222
        27
    dcll222  
       2018-03-07 16:26:11 +08:00
    密文都不能保证安全, 明文.....
    iceheart
        28
    iceheart  
       2018-03-07 17:07:53 +08:00 via Android
    情况 1.假设你的登录服务是个私有服务,外部不可见,你对外的服务去访问登录服务。这种情况,如果你对外的服务被攻破,那么攻击者有可能修改你的对外服务,经过这个服务的账号密码全部泄露。
    情况 2.如果你的登录服务是对外可见的,那么这个登录服务会成为首要攻击目标,一旦被攻破,数据库里的所有账号密码全完蛋。
    liprais
        29
    liprais  
       2018-03-07 17:10:03 +08:00
    很简单,不能
    whileFalse
        30
    whileFalse  
    OP
       2018-03-07 19:40:21 +08:00
    @iceheart 登录服务私有;登录时仅传输用户名和密码和盐的哈希。盐每次登陆从登录服务获取。
    kamen
        31
    kamen  
       2018-03-07 19:49:31 +08:00
    不妨参考一下 lastpass
    msg7086
        32
    msg7086  
       2018-03-08 05:22:24 +08:00
    这问题可以转化成 黑箱+认证服务。
    整个系统只有一个访问入口,入口只接受账号密码并返回 Yes 或 No。
    前提条件,黑箱不会被人搬走,入口没有其他漏洞。

    这种情况下密码明文存储在黑箱中是安全的。

    这种做法和二次认证用的 USB Key 是一样的,USB Key 里存储私钥,但是对外只有一个访问入口,Key 只用来做不对称加密,没有办法直接从外部读取 Key 里写的私钥。只要访问入口安全,你的明文私钥存在 USB Key 里就是安全的。
    iceheart
        33
    iceheart  
       2018-03-08 08:13:59 +08:00 via Android
    如果服务被攻破,上传什么就完全由攻击者决定了。他可以夹带一段 js 到浏览器,想怎么干就怎么干
    whileFalse
        34
    whileFalse  
    OP
       2018-03-08 08:31:25 +08:00
    @iceheart 这就和本题目无关了吧。DB 里密码加密不加密无所谓了。
    ilibilib
        35
    ilibilib  
       2018-03-08 11:21:27 +08:00
    又要当表子,又要立牌坊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2736 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:52 · PVG 20:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.