我正在开发一款开源的阅读软件,为了实现同步需要让用户输入 WebDAV 账号和密码。
然而账号和密码都需要保存在本地,即使加密后存储,密钥也会在源码中公开。所以这似乎很难保证密码安全。
因此,我希望请教各位有没有什么安全且实用的密码存储方案,能够应对开源软件的这种情况?
1
baobao1270 240 天前 1
用系统的密码管理方案。
Windows 有「凭据管理器」 macOS 有「钥匙串」 Linux……这个碎片化比较严重,不同的 DE 有不同的管理方案 |
2
AoEiuV020JP 239 天前 via Android
让用户输入密码使用,
chrome Windows 上的做法是,不作为,密码随便拿,能读取 chrome 数据就是 chrome 的主人, chrome Linux 上的做法,使用桌面提供的 keyring ,默认第一次启动时设置密码,之后每次启动 chrome 都要输入密码, |
3
jifengg 239 天前
不是,“密钥也会在源码中公开”,你源码里的也应该只是一个示例密钥啊,你自己编译的时候肯定换成不公开的密钥啊
|
4
lltlo 239 天前
账号和密码组合起来,然后加盐各种变换,再取 hash 值存储起来?
即使是开源的,即使拿到了存储起来的 hash 值,也没法反推出原始账号和密码,必须输入原始的帐号和密码,再走一次计算流程,与存储起来的 hash 值对比,一致才认为帐号和密码是正确的。 |
5
axy173 OP @baobao1270 我在用 Flutter 开发,还需要满足移动端的要求,所以希望有一个统一的做法。
@AoEiuV020JP 用户需要提供一个 WebDAV 服务的账号和密码,然后存起来,我的软件需要这个账号和密码来上传、下载文件。 @jifengg 确实是方便有效,但还是想要完整公开所有的内容。 @lltlo 我不需要判断密码是否正确,只是存下来,之后软件需要凭借这个账号密码来向 WebDAV 服务器请求数据,担心的是本地存下来后如何保证不被窃取。 |
6
AoEiuV020JP 239 天前
@axy173 #5 就是两种做法,
一种默认能操作 app 私有数据的就是 app 的主人,不设防, 一种是 app 设置“应用密码”,用户通过密码访问其他一切私密数据包括你这里的 webdav 账号密码,都用这个应用密码加密保存, 具体到各端还可以考虑用平台限定的技术加密保存这个“应用密码”以简化操作,比如安卓用指纹加密,ios 用人脸,没有的就不保存这个“应用密码”,用户必须输入密码, 当然也可以结合两者,“应用密码”做成开关,关闭时不设防, |
7
KongLiu 239 天前
第一次启动的时候随机生成一个盐值保存起来,然后账号密码用生成的盐值存储,不过这种办法也只是增加盗取难度
|
8
lltlo 239 天前
因为 app 是开源的,所以本地存储的数据必须要有外部数据参与,要么每次登录的时候输入一个管理密码,用这个管理密码来加密、解密数据文件,要么取本地硬件信息来参与加密、解密数据文件,这样只要不在同一台机器,即使数据文件被别人拷贝走,也解密不了。
|
9
oneisall8955 239 天前 via Android
设计的时候尽量使用浏览器请求(密码存储到浏览器)
如果确实需要后端调用,Demo 站点每日清空&重置数据库 后端存储敏感信息使用非对称加密 私钥公钥作为配置项,Demo 站点的配置项不要暴露在源码 |
10
qiaorenzhi 239 天前
1 、使用 OAuth 或 OpenID Connect 等身份验证协议:可以考虑使用第三方身份验证服务,如 Google 、Facebook 等提供的 OAuth 服务,或者使用 OpenID Connect 等开放标准,让用户通过第三方认证,并获取令牌来访问 WebDAV 服务,而无需直接存储用户密码。
2 、使用单向哈希函数存储密码:将用户密码通过单向哈希函数(如 bcrypt 、PBKDF2 )进行哈希,然后将哈希后的值存储在本地。这样即使源代码泄露,也无法直接获取用户的原始密码。在用户登录时,将其输入的密码再次哈希并与存储的哈希值进行比对。但需要注意选择适当的哈希算法和加盐策略来增加安全性。 |
11
leonshaw 239 天前 via Android
让用户设置一个主密码来加密应用密码,主密码存系统钥匙链或者启动时输入。
|