开源软件中如何安全存储用户密码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
axy173
V2EX    问与答

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

  •  
  •   axy173 2024-04-30 12:13:20 +08:00 2086 次点击
    这是一个创建于 529 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    私钥公钥作为配置项,Demo 站点的配置项不要暴露在源码
    qiaorenzhi
        10
    qiaorenzhi  
       2024-04-30 17:53:19 +08:00
    1 、使用 OAuth 或 OpenID Connect 等身份验证协议:可以考虑使用第三方身份验证服务,如 Google 、Facebook 等提供的 OAuth 服务,或者使用 OpenID Connect 等开放标准,让用户通过第三方认证,并获取令牌来访问 WebDAV 服务,而无需直接存储用户密码。
    2 、使用单向哈希函数存储密码:将用户密码通过单向哈希函数(如 bcrypt 、PBKDF2 )进行哈希,然后将哈希后的值存储在本地。这样即使源代码泄露,也无法直接获取用户的原始密码。在用户登录时,将其输入的密码再次哈希并与存储的哈希值进行比对。但需要注意选择适当的哈希算法和加盐策略来增加安全性。
    leonshaw
        11
    leonshaw  
       2024-04-30 18:03:08 +08:00 via Android
    让用户设置一个主密码来加密应用密码,主密码存系统钥匙链或者启动时输入。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2304 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:56 PVG 23:56 LAX 08:56 JFK 11:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86