大家可以说一下,如何提高用户信息的安全性呢?
登录,注册信息一般怎么安全的保存在Mysql中呢?
基于数据库实现一套自定义的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字段没有被修改过
看到深入探讨这几个字我进来了,然而看到问题时,就有点尴尬了…然而我也只懂一些些基本的
首先说,注册,注册的时候提交方式可以用from也可以用ajax,请求类型一般为post,post相对来说比get要安全些,用户名,生日等信息保存铭文,密码等重要的要加密(php中一般用md5),采用密码+token的方式进行加密。
登陆的时候,加验证,比如现在流行的验证码、手机验证码等,其中验证码的复杂性也可以掌控,最简单的就是数字验证了,复杂的图文等;然后就是登陆密码了,登陆密码最好是在前端用算法加密后再去后端,与用户密码匹配了。
大概就是这样了(手机码的,排版不好看,请谅解~)
加密这一块,不要单纯的采用MD5和SHA1,目前已经破解了8位以下字符串MD5加密后的值,其实MD5和SHA1混合加密也不安全,安全的做法是数据库中保留一个salt字段(通常来说就是加盐),盐值长度为32位,用户修改密码的时候改变盐值,这样采用MD5和SHA1和加盐方式进行加密,如SHA1(MD5($pass.$salt).$salt);具体看你怎么做吧
4 回答968 阅读
2 回答840 阅读
1 回答649 阅读✓ 已解决
2 回答619 阅读
2 回答686 阅读
1 回答644 阅读
604 阅读
后台:
PHP的密码专用加密函数是:
password_hash,验证是否正确:password_verifyMD5/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等操作系统内核