谈谈PHP中用户登录的问题
简单介绍下用户密码认证机制,用户注册时输入密码后,密码将会进行相应的加密存入数据库,加密的原则是不可逆性,就是让人很难从加密后的变成原有的密码。用户进行密码认证的时候,将其输入的密码进行相同的加密技术,然后与数据库存有的加密后的密码进行对照,然后根据对照结果返回相应的值。
书本上的密码加密采用的是MD5方式,结果发现网上居然有解密库,可以直接根据加密后的代码从密码库中找出原码。然后又找了各种方式,最后觉得相对可行一点的就是md5(md5($pass).$salt)形式。即先将密码进行md5加密,然后给加密后的内容插入随机生成的salt内容,然后再对加了salt之后的字符串进行md5加密,同时salt是存在数据库中的,这样就必须同时拿到加密后的内容和salt值才有可能获取原密码。
下面就是到了cookie和session的问题。加密setcookie()函数进行cookie的设置,其中可以将密码进行加密然后存在cookie中。在网上查找相关方式的时候看到个感觉相对不错的PW使用的方式。与之前提到的加salt值同时两次md5加密的方式类似。但是这里的salt不是随机生成存在数据库的,而是读取的用户客户端信息,即$GLOBALS[‘HTTP_USER_AGENT’的值。设想一下,验证的时候读取用户的客户端信息,然后与密码进行混合加密进行对照,用户的客户端信息完全复制的可能性不是很大,所以相对来说安全性高一点(从我目前的认知角度)。
下面的就是对用户提交的重要的post内容进行加密。这个是在群里与别人讨论的时候提到的,由于普通的网站很少有用到https进行重要内容的加密传送,所以可以采用一种取代方式,即通过js进行加密。在网上找了相关的资料,最后觉得比较好的就是通过随机生成$post_key值,然后自己来编写加密算法,并且将$post_key放入到算法中,就能保证每次每个用户提交的加密都不一样。服务器端再通过PHP算法进行解密,然后进行其他操作。
补充:
可以在用户登录的cookie过期的时候重设存在数据库里面的salt值,入侵获得的数据库中的密文只是临时密文,随时可能会自动改变,某种意义上来说毫无意义。