V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drymonfidelia
V2EX  ›  信息安全

登录接口明文密码在浏览器端先加盐 SHA512 一次,服务端再用 bcrypt 等慢哈希算法二次加密存储是最佳实践吗?为什么多个大厂都发生过不小心在日志输出用户明文密码的事件,不加密或可逆加密传输用户密码仍是主流

  •  1
     
  •   drymonfidelia · 21 小时 23 分钟前 · 3376 次点击
    加盐 SHA512 这种方案反而我基本没见过
    如果是为了检测是否是泄露的或者是弱密码,那可以把常用密码数据库同样加盐 SHA512 一次再保存(不过这样就要求 SHA512 的盐全部用户相同)或者把 1000 个常见密码发到客户端,在客户端判断
    还有一种方案是 Scrypt KDF 以前在 discord 上看到有人讨论过,有实际应用案例吗
    51 条回复    2025-09-09 22:27:45 +08:00
    2wex
        1
    2wex  
       19 小时 8 分钟前
    互联网企业搞安全成本高收益小,除非监管强制要求,否则能省就省
    abc612008
        2
    abc612008  
       18 小时 43 分钟前 via Android
    没法判断密码是否符合复杂度要求吧,大小写特殊符号之类的
    hyperbin
        3
    hyperbin  
       18 小时 34 分钟前 via Android
    因为就算泄露了没人追责,也没有天价罚款,所以无人在乎
    seth19960929
        4
    seth19960929  
       17 小时 51 分钟前
    你说得对,bcrypt 能解决密码问题,但是你架不住历史包袱久,重构账户相关出事了一锅端
    只要不重构禁不住有人打印整个模型,模型有自带解密方法
    至于你说的检测规则,都已经加密传输了,直接从前端检测就好了,还检验什么😂前端搞坑多
    所以还是后端哈希,片段 HTTPS 就行了,至于密码的事,后端的问题自己解决,工程化的工程化,不然下次没课密码,还有身份证,手机号
    yy306525121
        5
    yy306525121  
       17 小时 50 分钟前 via iPhone
    我们都是直接对称加密或者非对称加密,到后端再解密
    codehz
        6
    codehz  
       17 小时 42 分钟前 via Android   ❤️ 1
    零知识证明不就可以了?😓比如 telegram 用的 srp 协议和更通用的 pake 协议,只要保证客户端没人篡改,就没人可以解密原始密码,服务器也不知道
    xuanbg
        7
    xuanbg  
       17 小时 23 分钟前
    服务器本来就不应该知道用户的密码是什么。严格来说,就是明文密码不出客户端。只要这个密码离开客户端,就要用摘要算法计算 hash 值代替。

    另外,加密传密码是什么鬼?你拿用户的密码想干什么?
    Lexgni
        8
    Lexgni  
       17 小时 17 分钟前
    @xuanbg 只传摘要,那设置密码也穿摘要吗
    xuanbg
        9
    xuanbg  
       17 小时 15 分钟前
    @Lexgni 当然啦,通过别的方式而非密码验证用户身份的合法性,譬如短信验证码。
    wangtian2020
        10
    wangtian2020  
       17 小时 15 分钟前
    你是老板还是打工的,加密差不多够用就得了
    evill
        11
    evill  
       17 小时 11 分钟前
    不是这种方式有什么难度,也不是这样做有什么成本

    而是做的某种程度(特别是 toC)有人会要你明文保存,但是没文件没规定
    最搞笑的是这个和等保还是冲突的
    selca
        12
    selca  
       17 小时 11 分钟前
    前端判断强度就完事儿,你硬要用接口突破安全行为,设置弱密码,我这儿也看不到密码原文。

    实在要全链路安全,还得设计类似 tls 的公私钥握手过程。
    darkengine
        13
    darkengine  
       17 小时 11 分钟前
    先问是不是,有哪些“多个大厂都发生过不小心在日志输出用户明文密码的事件”?
    ladypxy
        14
    ladypxy  
       17 小时 9 分钟前
    前端加密本身就是脱裤子放屁的事,都有 https 了前端加密的意义是什么
    superrichman
        15
    superrichman  
       17 小时 1 分钟前
    @ladypxy https 是防传输过程泄密,前端哈希可以防止在传输目的地的服务端泄密,两者并不冲突。
    capric
        16
    capric  
       16 小时 54 分钟前   ❤️ 1
    yb2313
        17
    yb2313  
       16 小时 53 分钟前
    为什么要在前端加盐, 如果会被截取, 人家直接拿加盐后的密码当密码用不就行了吗? 如果不会被截取, 那直接明文传输在后端加盐哈希存储才对吧?
    totoro52
        18
    totoro52  
       16 小时 53 分钟前
    《大厂都发生过不小心在日志输出用户明文密码的事件》
    没听说,至少我不会把用户登录信息输出到 log 上,没啥意义也不必要这么做
    bfdh
        19
    bfdh  
       16 小时 52 分钟前
    @xuanbg #7 "加密传密码是什么鬼?你拿用户的密码想干什么?"
    1 、客户需求,而且这个客户还不听劝;
    2 、有些软件就是需要明文密码,比如 pppoe-server 、svn server 、ftp server ,虽然有些可以结合其他软件使用非明文密码,但简单实现都是基于明文的。
    way2create
        20
    way2create  
       16 小时 39 分钟前   ❤️ 1
    不前端加密 新项目都是直接 https+bcrypt 旧项目懒得管 他们怎么写我用啥 不操心这些

    如果还需要加强安全措施不都是二次验证之类的

    至于前端加密,B 站那些卖课的就喜欢搞这些

    另外如果一个项目日志会泄露这些。。。那估计我想就不单单是密码的问题了
    loading
        21
    loading  
       16 小时 27 分钟前 via Android
    我有个项目就是的在前端加盐 hash 后给后端的,密码强度验证就只在前端,后端只收到 hash 结果。
    shunia
        22
    shunia  
       16 小时 13 分钟前   ❤️ 1
    前端加密也好,hash 也好,作用是什么?完全没看懂。

    我只能想到一个作用,就是拿这个特定的用户名和密码组合来做碰撞攻击其他服务/工具。
    shenjinpeng
        23
    shenjinpeng  
       16 小时 1 分钟前   ❤️ 1
    服务器端有一百种方式泄露用户密码, 例如 nginx 日志, 网关层, 框架日志, 接口请求记录, 中间各层 HTTP 请求,RPC 请求 ... 不管怎么样, 从服务器接收到请求开始,再到用户中心给密码加密之前, 所有中间层能可以明文看到用户密码 .
    zzsong
        24
    zzsong  
       15 小时 46 分钟前
    没明白前端 hash 的意义在哪,对与服务端而言密码不就变成了前端 hash 后的值了吗?非但没有提升安全性,反而增加了碰撞的可能性。
    catamaran
        25
    catamaran  
       15 小时 44 分钟前
    1. 谈不上最佳实践,bcrypt 加密没啥争议,java 的主流做法。至于浏览器端加密,满足客户要求就好,最多的场景就是浏览器提交的密码不是明文就行。浏览器端加密本身争议就比较大,没必要非得求个定论。
    2. 密码泄漏我有印象的,一个是 csdn 被拖库,因为用明文存储的,另外一个是阿里云的事情,细节不记得了,原因是把 secretkey 写到了代码里,然后传到了 github 上。没听说过日志泄漏的。这种只能说开发也太没有安全意识了,敏感信息不该进日志。
    catamaran
        26
    catamaran  
       15 小时 41 分钟前
    @shenjinpeng 都能进入中间层了,明文密文还有意义吗?反正后端认就能利用。
    Building
        27
    Building  
       15 小时 35 分钟前
    第一 https 都被挟持了你做再多的加密都没用了
    第二密码可以携带多重信息的,比如可以在密码后面加验证码可以让老版本没有验证框的也能登陆
    nekoneko
        28
    nekoneko  
       15 小时 9 分钟前
    其实没意义. 前端明文 + https + bcrypt 即可. 至于 https 被劫持和 后端流程泄漏密码, 这是另外的问题.
    restkhz
        29
    restkhz  
       14 小时 55 分钟前
    有很多人说前端 hash 是为了防止服务器沦陷,比如服务器流量干脆被劫持,TLS 证书被盗。
    “服务端不可信任!”
    但是如果是 web 的话,入站流量里的密码能被劫持所以你 hash 了用户密码,思路 OK 。
    但是如果服务器已经沦陷,别人不能直接改你出站流量里前端 js 脚本吗?直接去掉 js 里 hash 步骤让用户明文提交,或者干脆就钓鱼,咋办?
    或许你做的是 APP 的 API 吧,不从服务器接收认证逻辑,我不否认这是一种纵深防御思想...

    我对此的态度是,反正没有太大收益,只要不怎么增加复杂性,开心就好。

    因为信任 TLS ,信任服务端。我想这就是不 hash 提交密码的原因。
    否则服务端若不可信任,你大概要再做一套认证+加密,几乎就是再发明一个 TLS 了。

    所以我也不太清楚,TLS 后,前端流量还要加密一下的意义有多大,我见过有用 AES 的(对,还不是非对称),甚至比前端 TLS+hash 还难理解它的意义。

    不恰当的比喻:TLS 都能被攻破的情况下,你再加一层凯撒位移不会更安全。
    制造无意义的信任边界,过度设计只会让事情变得复杂,增加成本,甚至可能更不安全。

    btw ,什么是“可逆加密”?不可逆的加密是加密吗?(小声)
    lambdaq
        30
    lambdaq  
       14 小时 43 分钟前
    明文密码不一定是泄漏,还可能是试出来的。
    ala2008
        31
    ala2008  
       14 小时 42 分钟前
    我们会对敏感数据做非对称加密再传输
    Hozoy
        32
    Hozoy  
       14 小时 41 分钟前
    Google 登录至今还是传输的明文密码,Twitter 也发生过明文密码记录到 log 的安全事故。所以明文传输密码本身并没有什么问题,只要后续链路存储规范即可。
    ladypxy
        33
    ladypxy  
       14 小时 37 分钟前
    @superrichman 你服务器都能泄密了,你啥加密都没意义了
    superrichman
        34
    superrichman  
       14 小时 27 分钟前
    @yb2313 盐即使泄露,问题通常也不大。盐的主要目标是防止相同密码产生相同哈希,以及抵御彩虹表攻击。只要每个用户、每条记录的盐都不同,这样即使攻击者拿到所有盐和哈希,也不能用一个统一的预计算表(彩虹表)去快速破解。

    @ladypxy 服务器泄密,接收的和存储的是哈希过的信息,不会泄露原始信息,怎么会没有意义。

    加密/哈希的意义就是“把泄露变得不等于彻底泄露”,降低风险,增加攻击者成本。
    yulon
        35
    yulon  
       13 小时 41 分钟前
    楼上那么多人连 hash 不是加密都不知道,笑不活了。

    难得 LZ 那么有责任心来问一下,结果钓出那么多卧龙凤雏。

    明文密码泄漏,是怕你用密码拿去尝试登陆别的网站,不只是泄漏密码的这一家网站的事情。
    irrigate2554
        36
    irrigate2554  
       13 小时 11 分钟前
    用密码管理器的表示没关系,你安全做的不好泄漏也影响不到我其它网站
    ZhiyuanLin
        37
    ZhiyuanLin  
       13 小时 10 分钟前   ❤️ 4
    这个问题叫 ZKPP ( zero-knowledge password proof ),已经有非常成熟的方案例如楼上提到的 SRP ,PAKE 。
    码农不要自己用半吊子的密码学知识拍脑袋想方案,真要安全就用已经标准化的 scheme 。
    不过互联网企业大部分属于是能 hash 一下已经是业界领先的水平。
    BaiLinfeng
        38
    BaiLinfeng  
       12 小时 48 分钟前
    我怎么没看懂这是在说啥哦
    ladypxy
        39
    ladypxy  
       12 小时 27 分钟前
    @superrichman 服务器泄密,接收的和存储的是哈希过的信息。你服务器登录啥的用的都是哈希过的信息了,不是院士信息,那你这些信息泄漏了别人完全可以伪造登录了。那你的意义在哪里?
    way2create
        40
    way2create  
       12 小时 26 分钟前
    @yulon 没什么别的意思 单纯好奇一下 你说的楼上那么多人是谁呢 我咋没看到有很多 求科普
    除了一个说 bcrypt 加密的 很多 v 友提到加密不都是针对 op 最后一句话问的“为什么不加密传输仍是主流”回的吗
    superrichman
        41
    superrichman  
       12 小时 3 分钟前
    @ladypxy 哈希的意义在于保护原始密码,从而避免更大范围的损失。保护了用户在其他平台上的安全,不至于“一处泄露,处处沦陷”。

    如果服务器直接保存明文密码,一旦泄露,攻击者不仅能直接登录这个系统,还能尝试用相同的密码去撞库或者了解你的密码设置习惯,攻击你的邮箱、社交媒体、支付账户等更高价值的服务。

    而保存的是哈希值时,攻击者手里拿到的并不是密码本身,而是需要通过暴力破解手段反推,成本和难度大大提高。
    aloxaf
        42
    aloxaf  
       12 小时 0 分钟前
    @ZhiyuanLin 确实,hash 一下业界领先、加盐业界前沿、会用密码哈希已经是行业领军了
    irrigate2554
        43
    irrigate2554  
       11 小时 42 分钟前
    相比于密码在 https 传输过程或者后端日志泄漏带来的风险,普通用户使用弱密码的风险更大,所以还是针对弱密码做后端校验吧。
    dzdh
        44
    dzdh  
       11 小时 41 分钟前
    webcrypto pbkdf2
    yb2313
        45
    yb2313  
       11 小时 9 分钟前
    @ZhiyuanLin 密码学, 很神奇吧, 只要两次通信就能实现一个十分甚至九分的安全密码验证
    tyqing
        46
    tyqing  
       10 小时 20 分钟前
    我在 6 年前抓过国际大厂的登录接口,都是明文传输密码的,现在抓谷歌的登录接口也是明文的。
    liuidetmks
        47
    liuidetmks  
       8 小时 45 分钟前
    行业已经有最佳实践了,别闭门造车了
    OPAQUE: The Best Passwords Never Leave your Device

    https://blog.cloudflare.com/opaque-oblivious-passwords/


    月经问题了
    iseki
        48
    iseki  
       8 小时 38 分钟前 via Android
    有些场合要求服务端必须能拿到口令明文。
    Dlad
        49
    Dlad  
       8 小时 34 分钟前
    十多年了,做的严肃项目都是前端 md5 ,后端每用户一个 salt 再次 hash 。
    推广 https 后,前端密码都明文传输了……

    中间人攻击都要防……活着太累了!都接入 Authenticator 算了。
    ZhiyuanLin
        50
    ZhiyuanLin  
       3 小时 56 分钟前
    @liuidetmks #45
    > 行业已经有最佳实践了,别闭门造车了
    > OPAQUE: The Best Passwords Never Leave your Device

    当前最佳实践其实应该是 Passkey ,不用用户记住密码了,连 identifier 都一起搞定了。
    而且除了 session hijack 几乎完全没有盗号可能性。
    drymonfidelia
        51
    drymonfidelia  
    OP
       3 小时 29 分钟前
    @ZhiyuanLin 先不说多少人能用 passkey ,用 passkey 作为唯一登录方式的话,你的客服邮箱一定会被一堆换了手机登录不进账号的邮件塞爆
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1165 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:56 · PVG 01:56 · LAX 10:56 · JFK 13:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.