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

2018-03-12 12:09:18 +08:00
 jeffreychiu95

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

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

以下是我的一些疑问:

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

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

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

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

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

服务器设定好告警提示

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

参考:
/t/128478

当然,在服务器被拿下的情况下,这也只是增加破解难度而已。
jeffreychiu95
2018-03-12 12:50:22 +08:00
@Moorj 谢谢您的回复。嗯,告警确实是需要的。另外我不太能确定您说的"环节上不填写密码"和我理解的意思是否一样。不填写密码的话我如何模拟登录呢?还是指的是我前面提到的不存储密码的方案?不知道您是否方便细述一下呢?
jeffreychiu95
2018-03-12 12:55:44 +08:00
@sw10 谢谢您回复。感谢您给出的参考项目,你提示了我签到这个和我的需求确实是异曲同工的。我会去参考您的实现方案,谢谢😁
iyaozhen
2018-03-12 13:02:52 +08:00
之前做过学校教务系统的爬虫,也存了上 w 个帐号。
就像 4 楼说的,基本上只能每个用户分配一个加密 key (可以由用户 id 生成),加密后存储在数据库。这样被脱裤了也没事,当然别人要拿到代码那也就 GG 了。
jeffreychiu95
2018-03-12 13:50:32 +08:00
@iyaozhen 嗯明白,就是说如果数据库和代码都在同一服务器的话,服务器被拿了相当于就可以完全复现对吗?
Level5
2018-03-12 15:09:09 +08:00
设计在程序跑的时候人工输入每项密码.一跑起来密码保存在内存,每次重启应用需要重输密码.OVER

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/437210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX