在开发一个网页的登录模块的时候,需要保证用户的密码安全。像之前的CSDN泄漏密码事件,就导致了许多的未加密的密码直接被知道了。对用户造成了不良的影响。所以构建一个安全的网站登录模块是很重要的事情的。

前提

本篇文章是在没有HTTPS协议下使用的,因为购买SSL证书需要一笔费用,而对于一些非企业的站点,这个费用还是比较多的。所以这篇文章是基于普通的HASH函数(常见的有MD5、SHA-512)进行的。

约定:明文密码 使用单词 password 表示

需要避免的事项

一个安全的网站的数据库要避免以下几条

  • 数据库中不能明文存储密码,即不能只是存储password
  • 不能存储密码的md5,不能存储md5(password)
  • 二次直接md5也是不安全的,不能存储md5(md5(password))

因为明文存储都懂的,万一数据库被攻破了,那密码就全知道了,不好。再就是一次的MD5是不安全的,现在完全能构造一个数据库,存储明文的key,和md5的value,这样通过对密文与数据库对比,就可以找到明文了。所以md5一次也是不安全的。另外两次的md5其实和一次的md5一样,也可以构造一个表,直接对比数据库。

基本要求

有以下的基本需求

  • 不能直接http明文发送密码
  • 不能直接传送密码的md5
  • 二次的密码md5也是不安全的
  • 同样的明文密码password对不同的用户存储不一样值
  • 防止重放攻击

如果http请求中直接传输明文密码,这样就需要数据库中要明文存储password了。其次普通的md5一次和两次md5的password也是没有安全效果的。另外在请求中要有一个是动态变化了,这样如果每次登录都使用同样的参数,第三方在截取http请求后,保存起来,将来可以伪造身份,进行登录。一般解决这个的办法就是添加验证码功能。随机生成一些字母或数字。

实现方法

下面介绍一个方案

数据库方面

针对数据库方面,数据库中不能保存md5(md5(password)),数据库中的密码值至少要有md5(username+md5(password)),这样每个用户名,及时明文密码相同,但是密文的密码却不一样。

网站前台

使用md5的js插件,在提交的时候将密码进行hash,然后和验证码一起在hash一下。提交

网站后台

对数据库中的存储的值和验证码进行hash,然后判断是否符合。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 构建安全的网站登录模块 – https://www.chenyudong.com/archives/build-website-login-security-module.html