开源软件中如何安全存储用户密码?

2024-04-30 12:13:20 +08:00
 axy173

我正在开发一款开源的阅读软件,为了实现同步需要让用户输入 WebDAV 账号和密码。

然而账号和密码都需要保存在本地,即使加密后存储,密钥也会在源码中公开。所以这似乎很难保证密码安全。

因此,我希望请教各位有没有什么安全且实用的密码存储方案,能够应对开源软件的这种情况?

2077 次点击
所在节点    问与答
11 条回复
baobao1270
2024-04-30 12:17:26 +08:00
用系统的密码管理方案。
Windows 有「凭据管理器」
macOS 有「钥匙串」
Linux……这个碎片化比较严重,不同的 DE 有不同的管理方案
AoEiuV020JP
2024-04-30 12:53:30 +08:00
让用户输入密码使用,
chrome Windows 上的做法是,不作为,密码随便拿,能读取 chrome 数据就是 chrome 的主人,
chrome Linux 上的做法,使用桌面提供的 keyring ,默认第一次启动时设置密码,之后每次启动 chrome 都要输入密码,
jifengg
2024-04-30 13:47:55 +08:00
不是,“密钥也会在源码中公开”,你源码里的也应该只是一个示例密钥啊,你自己编译的时候肯定换成不公开的密钥啊
lltlo
2024-04-30 15:09:08 +08:00
账号和密码组合起来,然后加盐各种变换,再取 hash 值存储起来?
即使是开源的,即使拿到了存储起来的 hash 值,也没法反推出原始账号和密码,必须输入原始的帐号和密码,再走一次计算流程,与存储起来的 hash 值对比,一致才认为帐号和密码是正确的。
axy173
2024-04-30 15:22:06 +08:00
@baobao1270 我在用 Flutter 开发,还需要满足移动端的要求,所以希望有一个统一的做法。

@AoEiuV020JP 用户需要提供一个 WebDAV 服务的账号和密码,然后存起来,我的软件需要这个账号和密码来上传、下载文件。

@jifengg 确实是方便有效,但还是想要完整公开所有的内容。

@lltlo 我不需要判断密码是否正确,只是存下来,之后软件需要凭借这个账号密码来向 WebDAV 服务器请求数据,担心的是本地存下来后如何保证不被窃取。
AoEiuV020JP
2024-04-30 15:36:20 +08:00
@axy173 #5 就是两种做法,
一种默认能操作 app 私有数据的就是 app 的主人,不设防,
一种是 app 设置“应用密码”,用户通过密码访问其他一切私密数据包括你这里的 webdav 账号密码,都用这个应用密码加密保存,
具体到各端还可以考虑用平台限定的技术加密保存这个“应用密码”以简化操作,比如安卓用指纹加密,ios 用人脸,没有的就不保存这个“应用密码”,用户必须输入密码,
当然也可以结合两者,“应用密码”做成开关,关闭时不设防,
KongLiu
2024-04-30 15:46:57 +08:00
第一次启动的时候随机生成一个盐值保存起来,然后账号密码用生成的盐值存储,不过这种办法也只是增加盗取难度
lltlo
2024-04-30 15:48:48 +08:00
因为 app 是开源的,所以本地存储的数据必须要有外部数据参与,要么每次登录的时候输入一个管理密码,用这个管理密码来加密、解密数据文件,要么取本地硬件信息来参与加密、解密数据文件,这样只要不在同一台机器,即使数据文件被别人拷贝走,也解密不了。
itechify
2024-04-30 17:33:29 +08:00
设计的时候尽量使用浏览器请求(密码存储到浏览器)

如果确实需要后端调用,Demo 站点每日清空&重置数据库

后端存储敏感信息使用非对称加密

私钥公钥作为配置项,Demo 站点的配置项不要暴露在源码
qiaorenzhi
2024-04-30 17:53:19 +08:00
1 、使用 OAuth 或 OpenID Connect 等身份验证协议:可以考虑使用第三方身份验证服务,如 Google 、Facebook 等提供的 OAuth 服务,或者使用 OpenID Connect 等开放标准,让用户通过第三方认证,并获取令牌来访问 WebDAV 服务,而无需直接存储用户密码。
2 、使用单向哈希函数存储密码:将用户密码通过单向哈希函数(如 bcrypt 、PBKDF2 )进行哈希,然后将哈希后的值存储在本地。这样即使源代码泄露,也无法直接获取用户的原始密码。在用户登录时,将其输入的密码再次哈希并与存储的哈希值进行比对。但需要注意选择适当的哈希算法和加盐策略来增加安全性。
leonshaw
2024-04-30 18:03:08 +08:00
让用户设置一个主密码来加密应用密码,主密码存系统钥匙链或者启动时输入。

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

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

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

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

© 2021 V2EX