www.yzc577.com深化讨论,用户注册和登录安全题目,MySQL表的设计

( www.yzc577.com )

大家可以说一下,怎样进步用户信息的安全性呢?
登录,注册信息普通怎样安全的保管在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和加盐方法中断加密,如SHA1(MD5($pass.$salt).$salt);详细看你怎样做吧

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

//维护用户暗码的盐
$salt = sha1(uniqid($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,一周)
setcookie('sessid', $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 int(10) unsigned NOT NULL,
    session text NOT NULL,
    md5 char(32) 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字段没有被修正正

(看完/读完)这篇文章有何感想! www.yzc577.com的分享…

发表评论

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