jybox

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

  •  
  •   jybox · Apr 21, 2014 · 6542 views
    This topic created in 4433 days ago, the information mentioned may be changed or developed.
    这样的好处:明文密码自始至终不经过服务器,避免了服务器运维失误出现泄露明文密码的情况(例如前一阵的 Heartbleed).
    27 replies    2015-09-13 08:21:42 +08:00
    ETiV
        1
    ETiV  
       Apr 21, 2014
    QQ 的web登录就是这么做的

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

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

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

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

    如果被单个盯上了。那么基本是跑不掉了。 T_T
    printf37
        24
    printf37  
       Apr 22, 2014
    选择一种非对称加密算法F
    注册的过程使用SSL

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

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

    随便YY的,不知道行不行
    dndx
        25
    dndx  
       Apr 22, 2014   ❤️ 1
    @printf37 既然都用 SSL 了,不如全程 SSL 。关你什么算法,没有 SSL 保护直接向页面注射一段 JS 发送击键事件就跪了。
    ipconfiger
        26
    ipconfiger  
       Apr 22, 2014
    https不買證書一樣會被中間人攻擊的
    depr
        27
    depr  
       Sep 13, 2015
    @dong3580 我也做过类似的设计,但是这样的问题是 C1 这个 token 如果被 http 嗅探到的话,那么攻击者可以获得完全的权限,因为服务端只通过这个 token 来识别用户身份,而且还没有类似于 web 端,让 session 失效的功能。我打算为此再配备 https ,放置 token 被嗅探,同时在后端可能要追踪一些特殊情况,比如异地登陆,长期不登陆之后再次登陆等异常现象,然后给用户发送一些提醒邮件。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4191 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 00:58 · PVG 08:58 · LAX 17:58 · JFK 20:58
    ♥ Do have faith in what you're doing.