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

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

  •  
  •   jybox · 2014-04-21 16:49:32 +08:00 · 5603 次点击
    这是一个创建于 3871 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这样的好处:明文密码自始至终不经过服务器,避免了服务器运维失误出现泄露明文密码的情况(例如前一阵的 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   ·   实用小工具   ·   3505 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:47 · PVG 12:47 · LAX 20:47 · JFK 23:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.