设计 Web 站点的登录功能时,是否有必要将密码在前端进行一次散列再发往服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jybox
V2EX    信息安全

设计 Web 站点的登录功能时,是否有必要将密码在前端进行一次散列再发往服务器

  •  
  •   jybox 2014-04-21 16:49:32 +08:00 6149 次点击
    这是一个创建于 4244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这样的好处:明文密码自始至终不经过服务器,避免了服务器运维失误出现泄露明文密码的情况(例如前一阵的 Heartbleed).
    27 条回复    2015-09-13 08:21:42 +08:00
    ETiV
        1
    ETiV  
       2014-04-21 16:54:45 +08:00
    QQ 的web登录就是这么做的

    密码+验证码一起 hash 后再发出去

    所有不需要手工输入验证码的地方, 验证码都是 ! 开头的.
    txlty
        2
    txlty  
       2014-04-21 16:56:45 +08:00   1
    避免不了的。登录凭证总会出现在服务器内存里(不一定是明文密码)。
    客户端本来就该散列一下。即使需要获取明文密码,也该可逆加密一下。QQ就是RSA可逆加密,服务端有私钥可以还原出明文密码,中间人是抓不到明文密码的。
    dong3580
        3
    dong3580  
       2014-04-21 17:00:48 +08:00
    @jybox
    目前我的做法:
    1,服务端保存方式 X = MD5(MD5(密码)+用户名)
    2,客户端 C1= MD5(MD5(验证码)+MD5(MD5(密码)+用户名)))
    3,客户端会发送 C1 和 用户名 到服务器
    4,服务器 验证 C1 = MD5(MD5(验证码)+X)
    说的很乱,楼主将就着看哈。
    唯一不安全的地方就是注册的时候!
    另外可以依照这个模式拓展加密的方法,小众加密一下,
    ibudao
        4
    ibudao  
       2014-04-21 17:09:25 +08:00
    @txlty 貌似浏览器上的js还不能RSA加密吧。。
    jybox
        5
    jybox  
    OP
       2014-04-21 17:10:00 +08:00
    @txlty 我的出发点是『对用户而言服务器也是不应当信任的』,虽然服务器对登录凭证有完全的控制权限,但是对于『明文密码』这类隐私信息,不应当让服务器知道。
    jybox
        6
    jybox  
    OP
       2014-04-21 17:11:06 +08:00
    txlty
        7
    txlty  
       2014-04-21 23:48:43 +08:00
    brickgao
        8
    brickgao  
       2014-04-22 00:09:02 +08:00
    我觉得没有必要吧,如果有中间人攻击的话是可以篡改网页内容的。
    jakwings
        9
    jakwings  
       2014-04-22 00:35:16 +08:00
    @jybox 这么说,就是只希望每次都用一次性密码,或者使用明文模糊后产生的不可逆密码,再经过 RSA 之类的加密方式传递到服务器,以求用户的「人性化密码」不被入库?
    dndx
        10
    dndx  
       2014-04-22 01:57:40 +08:00
    不可以,否则被脱裤散列起不到任何保护作用。黑客直接发散列就能登录。
    crab
        11
    crab  
       2014-04-22 02:02:10 +08:00
    客户端提交时密码RSA公钥,服务端RSA私钥解密。可以防止监听抓包这些吧。
    tioover
        12
    tioover  
       2014-04-22 02:09:08 +08:00 via Android
    可以是可以,但是服务器要加盐二次散列
    dorentus
        13
    dorentus  
       2014-04-22 02:24:39 +08:00 via iPhone
    「A false sense of security is worse than being unsure.」
    dndx
        14
    dndx  
       2014-04-22 04:40:14 +08:00 via iPhone   1
    @crab 不使用 SSL ,公钥也可能在传输途中被替换。
    chemzqm
        15
    chemzqm  
       2014-04-22 05:01:43 +08:00
    安全需求不是特别高可以学学weibo密码附加用户名的一部分字符做个base64,实现简单一些,也能部分防止中间人。可能你的项目黑客都没兴趣入侵,先不用想太多吧,真需要安全的话请用https。
    bitbegin
        16
    bitbegin  
       2014-04-22 07:57:03 +08:00 via Android
    使用公私钥加解密的是否所有用户都使用一对
    wy315700
        17
    wy315700  
       2014-04-22 08:24:30 +08:00   1
    客户端散列没必要,因为如果遭到劫持,他可以把散列后的结果给你重放一遍
    wwek
        18
    wwek  
       2014-04-22 09:00:25 +08:00
    即便是 中间人攻击抓到了 散列后的密文 可以登录。
    我们也需要散列加密。 怎么都比明文好
    cdffh
        19
    cdffh  
       2014-04-22 09:53:50 +08:00
    如果 从纯粹技术的的角度考虑 不想用https的话,还是散列一下比较靠谱。
    yyfearth
        20
    yyfearth  
       2014-04-22 12:06:12 +08:00
    @dndx 从系统的角度考虑是多余的 不能起到保护系统
    但是从用户考虑 这样做至少可以保护用户密码原文

    @cdffh 走https是必须的 不然中间人攻击 无法避免,大不了可以在html里面加script直接发密码原文,什么都防不了(就算是有CSP保护,中间人大不了可以把header拿掉再插script)
    而js加密,可以避免用户密码原文泄露,就是heartbleed,也只能拿到hash后的结果,虽然仍然可以用来攻击系统,但是避免用户被社工
    est
        21
    est      2014-04-22 12:13:34 +08:00
    用不着散列。再原密码后面随机加上一定字符再POST即可。服务器验证密码先去掉随机添加的字符,再验证。每次添加的字符和长度都随机。中间人拿到也是白拿。除非多次捕获。
    nigelvon
        22
    nigelvon  
       2014-04-22 12:23:17 +08:00
    @est 他可以拿到用户获得的表单页面,加上用户POST出去的内容就可以解出密码了,除非在客户端做非对称加密。
    est
        23
    est  
       2014-04-22 12:40:35 +08:00
    @nigelvon 好像也是。那么只能客户端散列了。不过客户端散列也没法避免重放攻击。所以还是得想个变化的方案。

    我是记得很多嗅探密码工具只会修改form POST里面password passwd pwd关键字的。稍微变化一下可以避免这种无脑嗅探。

    如果被单个盯上了。那么基本是跑不掉了。 T_T
    printf37
        24
    printf37  
       2014-04-22 12:49:06 +08:00
    选择一种非对称加密算法F
    注册的过程使用SSL

    用户注册时:
    在本地浏览器中,仅以用户名和密码为种子(不得引入其它熵来源)生成n个随机数
    用这些随机数生成F的一对密钥
    把公钥发送至服务器

    用户登陆时:
    首先提交用户名
    服务器使用该用户的公钥和算法F加密一串随机数和当前时间发送至客户端
    客户端重复注册时的密钥生成逻辑,在本地生成私钥
    用私钥解密得到随机数,验证服务器端时间
    将随机数附上当前时间和验证码答案再用私钥加密发送至服务器
    服务器用公钥解密,检查随机数、客户端时间、验证码答案
    放行

    随便YY的,不知道行不行
    dndx
        25
    dndx  
       2014-04-22 12:56:48 +08:00   1
    @printf37 既然都用 SSL 了,不如全程 SSL 。关你什么算法,没有 SSL 保护直接向页面注射一段 JS 发送击键事件就跪了。
    ipconfiger
        26
    ipconfiger  
       2014-04-22 13:31:10 +08:00
    https不一被中人攻的
    depr
        27
    depr  
       2015-09-13 08:21:42 +08:00
    @dong3580 我也做过类似的设计,但是这样的问题是 C1 这个 token 如果被 http 嗅探到的话,那么攻击者可以获得完全的权限,因为服务端只通过这个 token 来识别用户身份,而且还没有类似于 web 端,让 session 失效的功能。我打算为此再配备 https ,放置 token 被嗅探,同时在后端可能要追踪一些特殊情况,比如异地登陆,长期不登陆之后再次登陆等异常现象,然后给用户发送一些提醒邮件。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5791 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 02:30 PVG 10:30 LAX 18:30 JFK 21:30
    Do have faith in what you're doing.
    ubao msn 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