仓库源文站点原文


key: 18 title: 安全地传递密码

tag: experience

前端要想安全地将密码传递给后端, 应该按照以下几步操作:

前端

  1. 将明文密码作 md5 哈希;
  2. 将哈希过的密码拼上一段随即生成的, 固定长度的盐;
  3. 将上一步的结果使用后端的公钥加密并传递给后端.

后端

  1. 将前端传递过来的密码用私钥解密;
  2. 去盐. 因为盐是固定长度的, 所以直接裁剪即可;
  3. 再次随机生成一段盐;
  4. 将第2步去盐后的密码拼上第3步生成的盐, 并作 md5 哈希;
  5. 将第4步的结果和第3步生成的盐存入数据库.

验证密码的时候, 后端只需将第2步去盐后的密码拼上从数据库中取得的盐, 作 md5 哈希后与数据库中的密码相比较即可.

这么做的原因

  1. 为什么前端要将明文密码作 md5 哈希并拼上盐再加密?

    因为公钥是公开的, 而明文秘密是简短并有一定意义的. 如果直接拿明文密码用公钥加密, 黑客就可以截获这个数据包, 然后不断尝试密码, 用公钥加密并和截获的密码相比较, 从而破解密码. 如果密码安全系数低(如生日), 黑客就可以很快破解. 将明文密码 md5 哈希后拼上盐, 密码就变成无意义的了, 破解难度大大提升.

  2. 为什么后端要将 md5 后的密码拼上盐再作二次 md5 哈希?

    因为前端 md5 时没有拼上盐. 如果直接存储这个密码, 一旦数据库被泄露, 黑客就可以通过不断尝试密码, md5 哈希并与数据库中的密码相比较, 从而破解密码. 所以我们再次拼上盐并作二次哈希, 破解难度大大提升.