V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
axy173
V2EX  ›  问与答

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

  •  
  •   axy173 · 217 天前 · 1586 次点击
    这是一个创建于 217 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    私钥公钥作为配置项,Demo 站点的配置项不要暴露在源码
    qiaorenzhi
        10
    qiaorenzhi  
       217 天前
    1 、使用 OAuth 或 OpenID Connect 等身份验证协议:可以考虑使用第三方身份验证服务,如 Google 、Facebook 等提供的 OAuth 服务,或者使用 OpenID Connect 等开放标准,让用户通过第三方认证,并获取令牌来访问 WebDAV 服务,而无需直接存储用户密码。
    2 、使用单向哈希函数存储密码:将用户密码通过单向哈希函数(如 bcrypt 、PBKDF2 )进行哈希,然后将哈希后的值存储在本地。这样即使源代码泄露,也无法直接获取用户的原始密码。在用户登录时,将其输入的密码再次哈希并与存储的哈希值进行比对。但需要注意选择适当的哈希算法和加盐策略来增加安全性。
    leonshaw
        11
    leonshaw  
       217 天前 via Android
    让用户设置一个主密码来加密应用密码,主密码存系统钥匙链或者启动时输入。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:58 · PVG 00:58 · LAX 08:58 · JFK 11:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.