yzc577亚洲城娱乐深入探讨,用户注册和登录安全问题,MySQL表的设计

( yzc577亚洲城娱乐 )

大家可以说一下,如何提高用户信息的安全性呢?
登录,注册信息一般怎么安全的保存在Mysql中呢?

后台:

  • PHP的密码专用加密函数是:password_hash,验证是否正确:password_verify

  • MD5/SHA1 在PHP都是很过时的密码加密算法了

  • 使用password_hash得到的运算结果是有salt的,即使密码一样,每次密文都是不一样的,这样避免了数据库暴库。

  • 至少在目前来说,password_hash 的 cost = 10(默认),暴力破解不太可能

登录:

  • 登录除了HTTPS、或者ActiveX等浏览器插件做的密码输入框银行常用,无安全方法

  • HTTP的任何请求,都是明文传输,包括密码

  • 多么复杂的「验证码」都可以攻破,除非:12306

  • 比如:Discuz!等登录FORM表单,在submit之前会将密码MD5一下之后,再POST传输给后台

  • 但这只能在一定程度上面解决密码非明文的问题,中间人照样可以去暴力破解MD5

  • 当JS运行失败时,Discuz!并没有MD5密码就POST过去了(所以?)

Cookie:

  • Cookie里面不要记录任何形态的密码,这是绝对不安全的

  • set-cookie时使用httponly来拒绝Javascript对敏感信息的访问

  • 登录态必须使用Session来处理

  • 我看到楼主的问题标签中有Laravel,它的用户验证、保存登录机制可以好好学习一下,非常的优秀。

安全

  • SSL 加密是目前最安全的传输协议,可以预防中间人的攻击(前提是你的根证书是由国际知名CA颁发)

  • 但是也抵挡不住 键盘记录仪、木马。因为获得了电脑的控制权,我们还谈个鬼?

  • ActiveX/浏览器Plugins的 密码框 可以在一定程度上抵挡键盘记录

  • QQ客户端的密码输入框,使用键盘记录仪都读取不到密码,具体如何实现涉及到Ring0等操作系统内核

看到深入探讨这几个字我进来了,然而看到问题时,就有点尴尬了…然而我也只懂一些些基本的

首先说,注册,注册的时候提交方式可以用from也可以用ajax,请求类型一般为post,post相对来说比get要安全些,用户名,生日等信息保存铭文,密码等重要的要加密(php中一般用md5),采用密码+token的方式进行加密。

登陆的时候,加验证,比如现在流行的验证码、手机验证码等,其中验证码的复杂性也可以掌控,最简单的就是数字验证了,复杂的图文等;然后就是登陆密码了,登陆密码最好是在前端用算法加密后再去后端,与用户密码匹配了。

大概就是这样了手机码的,排版不好看,请谅解~

以前还参加过csdn的三天活动, 后来出了csdn密码明文的事, 再没看过. 还能再low点吗?

加密这一块,不要单纯的采用MD5和SHA1,目前已经破解了8位以下字符串MD5加密后的值,其实MD5和SHA1混合加密也不安全,安全的做法是数据库中保留一个salt字段(通常来说就是加盐),盐值长度为32位,用户修改密码的时候改变盐值,这样采用MD5和SHA1和加盐方式进行加密,如SHA1MD5$pass.$salt.$salt;具体看你怎么做吧

基于数据库实现一套自定义的cookie会话机制
这个cookie既要做到认证用户,又要做到不能被伪造和破解.

//保护用户密码的盐
$salt = sha1uniqid$user_id._.getmypid._.mt_rand._, true;

//数据库保存的用户密码$pwd_user是用户输入的密码明文
//可以先在浏览器端使用CryptoJS.MD5哈希密码后传给服务器处理,
//保证服务器对用户密码明文的不知情,最好使用https加密传输避免被窃听和修改.
$pwd_db = sha1$salt.sha1$pwd_user;
//password_hash返回值包含盐,这时不需要外部$salt参与.
//password_verify可实现耗时恒定的字符串比较避免时序攻击.
//$pwd_db = password_hash$pwd_user, PASSWORD_DEFAULT;

//cookie里的盐
//其中$global_salt是配置里定义的全局盐,用来保护用户的盐,一旦修改,所有用户的cookie都将失效.
$cookie_salt = sha1$global_salt.sha1$salt;

//最终生成的cookie内容
$cookie = base64_encode$user_id.|.$cookie_salt;
//如果你需要高安全性,还可以使用MCRYPT_BLOWFISH对整个cookie的内容做一次加密.
//$cookie = mcrypt_blowfish$cookie, $key;

//设置cookie,这里把过期时间设为604800秒60*60*24*7,一周
setcookiesessid, $cookie, time+604800, /, , false, true;

//解密cookie
//$cookie = mdecrypt_blowfish$_COOKIE[sessid], $key;

//解码分割后拿到里面的$user_id和$cookie_salt
//根据$user_id查询$salt拼出$cookie_salt,然后跟cookie里的$cookie_salt做对比,一致则通过cookie认证.
$cookie = explode|, base64_decode$_COOKIE[sessid];
$user_id     = $cookie[0];
$cookie_salt = $cookie[1];

用MySQL内存表实现会话存储

CREATE TABLE sessions 
    user_id int10 unsigned NOT NULL,
    session text NOT NULL,
    md5 char32 NOT NULL,
    PRIMARY KEY user_id
 ENGINE=MEMORY DEFAULT CHARSET=utf8;

其中:
user_id存储的是用户ID,作为主键.
session存储的是用户的会话数组经过serialize或json_encode后的字符串.
md5存储的是session字段的MD5值,用于实现Check And Set版本号乐观锁:

--读取会话
SELECT session, md5 --写入会话时需要用到这里查出来的md5,就是下面的$last_md5
FROM sessions WHERE user_id = $user_id
--写入会话
UPDATE sessions
SET session = $str, md5 = md5$str
WHERE user_id = $user_id 
AND md5 = $last_md5 --检查MD5,确保session字段没有被修改过

(看完/读完)这篇文章有何感想! yzc577亚洲城娱乐的分享…

发表评论

电子邮件地址不会被公开。 必填项已用*标注