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

服务器端如何安全存储用于模拟登录的密码?

  •  
  •   jeffreychiu95 · 2018-03-12 12:09:18 +08:00 · 4477 次点击
    这是一个创建于 2447 天前的主题,其中的信息可能已经有所发展或是发生改变。

    V 友们好,我有这么一个需求:
    目前有多个账号,需要每天登录指定的网站,抓取一些数据。

    以前都是在自己的电脑上直接运行的程序,现在想要把它部署在服务器上自动运行。
    我尝试 google 了一些服务器端密码存储的方案,找到的多数是服务器端就是做存储和验证的角色,没找到这种需要二次登录的情况。因为需要模拟登录,所以始终还是需要获取到登录目标网站的原始密码,不知道有没有比较安全的方案呢?

    以下是我的一些疑问:

    1. 假设在最坏情况下(服务器和数据库权限都被拿下),如果尽可能地减少密码被破解的几率呢?
    2. 密码储存在数据库里面的话,数据库方面如何尽量提高安全性呢?
    3. 如果密码不保存明文,而是保存使用加密算法加密后的数据,那么解密算法应该如何存放呢?

    我有想过这么一个方案:服务器端不保存密码,只转发模拟登录的请求,服务器端维护一个 cookies 池,只存储登录后的 cookies,定期更新 cookies,这样账户密码不需要储存在服务器端。但是觉得如果 cookies 被拿到了的话,别人就可以直接登录到目标网站,好像也不是很安全。

    不知道 V 友们有没有比较好的解决方案。由于本人还只是学生没有实际项目开发经验,对安全领域不太了解。上面的问题确实是我思考过并且想要了解的,如果有问的不妥当的地方,还请大神们不要见笑。

    欢迎大家推荐一些后台、运维安全方面的书籍或参考资料让我学习,谢谢大家。

    9 条回复    2018-03-12 15:09:09 +08:00
    aWangami
        1
    aWangami  
       2018-03-12 12:14:10 +08:00 via Android
    没关系的,服务器都被拿下了,还在意那些几个密码干嘛
    jeffreychiu95
        2
    jeffreychiu95  
    OP
       2018-03-12 12:21:00 +08:00
    @aWangami 感谢您的迅速回复。实际场景中我还没遇到过这个情况,但是我想了解一下发生了,如何能尽早察觉并减少损失呢?
    Moorj
        3
    Moorj  
       2018-03-12 12:31:38 +08:00
    环节上不填写密码,自动登录,也就是登录信息已经被存储在 cookies 中

    服务器设定好告警提示

    一旦服务器被拿下,立马修改网站密码
    sw10
        4
    sw10  
       2018-03-12 12:49:57 +08:00
    binux 的签到项目,大概是这么做的:
    1. 网站强制使用 HTTPS 访问
    2. 所有用户敏感数据使用每个用户唯一的 256 位密钥加密
    3. 再将用户密钥使用 256 位主密钥加密,所有解密过程只在内存中进行

    参考:
    /t/128478

    当然,在服务器被拿下的情况下,这也只是增加破解难度而已。
    jeffreychiu95
        5
    jeffreychiu95  
    OP
       2018-03-12 12:50:22 +08:00 via Android
    @Moorj 谢谢您的回复。嗯,告警确实是需要的。另外我不太能确定您说的"环节上不填写密码"和我理解的意思是否一样。不填写密码的话我如何模拟登录呢?还是指的是我前面提到的不存储密码的方案?不知道您是否方便细述一下呢?
    jeffreychiu95
        6
    jeffreychiu95  
    OP
       2018-03-12 12:55:44 +08:00 via Android
    @sw10 谢谢您回复。感谢您给出的参考项目,你提示了我签到这个和我的需求确实是异曲同工的。我会去参考您的实现方案,谢谢😁
    iyaozhen
        7
    iyaozhen  
       2018-03-12 13:02:52 +08:00
    之前做过学校教务系统的爬虫,也存了上 w 个帐号。
    就像 4 楼说的,基本上只能每个用户分配一个加密 key (可以由用户 id 生成),加密后存储在数据库。这样被脱裤了也没事,当然别人要拿到代码那也就 GG 了。
    jeffreychiu95
        8
    jeffreychiu95  
    OP
       2018-03-12 13:50:32 +08:00 via Android
    @iyaozhen 嗯明白,就是说如果数据库和代码都在同一服务器的话,服务器被拿了相当于就可以完全复现对吗?
    Level5
        9
    Level5  
       2018-03-12 15:09:09 +08:00   ❤️ 1
    设计在程序跑的时候人工输入每项密码.一跑起来密码保存在内存,每次重启应用需要重输密码.OVER
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:34 · PVG 20:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.