网站用户登录系统设计——jsGen实现版
来源:互联网 发布:山东网络继续教育学院 编辑:程序博客网 时间:2024/05/23 11:17
网站用户登录系统设计——jsGen实现版
ZENSH严清 http://weibo.com/zensh
jsGen 是基于 node.js、AngularJS 和 MongoDB 的网站系统。其用户登录系统也是相当独特。主要有以下特点:
- 用户注册时就在浏览器端对密码进行了二次哈希加密;
- 用户可使用用户名、注册邮箱或用户ID登录,通过浏览器端加密,每次登录请求发出的数据都完全不同,而且具有时效性;
- 自动登录机制;
注册
var data = { name: 'xxxxx', email: 'xxx@xxx.xxx', passwd: '********'};data.passwd = CryptoJS.SHA256(data.passwd).toString();data.passwd = CryptoJS.HmacSHA256(data.passwd, 'jsGen').toString();
注册时,浏览器端取得注册数据后,对原始密码进行二次哈希加密,再 POST 到服务器存储。
因为窃取者通常都有海量一次和二次 SHA256
的字典表,使用 HmacSHA256
加密后他们的字典表就没用了,暴利破解的话难度就高了很多。
浏览器端使用了 crypto-js 加密。
登录
var data = { logtime: Date.now() - app.timeOffset, logname: 'xxxxx' //用户名、邮箱或者用户ID logpwd: '********' //原始密码}data.logpwd = CryptoJS.SHA256(data.logpwd).toString();data.logpwd = CryptoJS.HmacSHA256(data.logpwd, 'jsGen').toString();data.logpwd = CryptoJS.HmacSHA256(data.logpwd, data.logname + ':' + data.logtime).toString();
jsGen 支持用户名、邮箱或者用户ID登录,并且引入了时间因素。源码中的timeOffset
是浏览器与服务器的时间差。
相对于注册,登录时多了一层 HmacSHA256
加密,这层加密引入了登录名和登录时间。时间因素有两个作用,一是每次生成的登录数据都不同,二是该登录数据具有了时效性,服务器能判断该登录数据是否超时(有效)。也就是说,即使用户登录数据能被非法截取,截取的数据每次都会不一样,而且只在短暂的时间内有效。
该登录数据 POST 到服务器后,服务器先通过 logtime
判断登录数据是否有效,然后再通过 logname
检索用户,提取先前注册时保存的 passwd
密文,经过如上第三层HmacSHA256
加密后判断是否与 logpwd
一致。
自动登录
若用户开启自动登录,则服务器在用户每次登录(包括自动登录)成功时会生成新的自动登录 cookie
,生成规则如下:
var data = { n: user._id, t: Date.now()};data.p = HmacSHA256(user.passwd, data.n + ':' + data.t);var cookie = new Buffer(JSON.stringify(data)).toString('base64'));
如上,加密规则实际上与登录一致,取用户ID、时间因素和密文,加密后变成一个标准的登录数据对象,先转成 JSON 字符串再转成 base64
字符串,然后种到用户的cookie
中。
用户向服务器发起数据请求时,服务器会先判断用户是否已登录,未登录则尝试cookie
自动登录,自动登录验证如下:
var data = new Buffer(req.cookie.autologin, 'base64').toString(); data = parseJSON(data); if (data) { data.logname = data.n; data.logtime = data.t; data.logpwd = data.p; data.ip = req.ip; userLogin(data); }
也就是将 cookie
数据还原成标准登录数据再进行登录。
结束语
设计以上登录机制时我并没有任何经验,那时也正是学习 JS 编程阶段。现在来看,相对于很多网站系统,这个登录机制已经相当先进了。只是,自动登录机制还有漏洞~
- 网站用户登录系统设计——jsGen实现版
- 社区网站系统 jsGen
- 用户登录系统实现
- 网站用户单点登录系统
- 网站系统的“用户登录”
- 网站用户登录注册实现
- 三层架构——系统用户登录模块功能实现
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 网站用户单点登录系统解决方案
- 使用MVC实现用户登录注册系统—银行管理系统
- 使用C#实现网站用户登录(转)
- 使用C#实现网站用户登录
- 一个简单的性能计数器:CodeTimer
- 关于编程的一些小软件
- Vuforia 高通AR for Unity 自动聚焦
- codevs3969[Mz]平方和 矩阵快速幂以及斐波那契数列性质的应用
- Cocos Studio中声音组件(ComAudio)的获取与播放
- 网站用户登录系统设计——jsGen实现版
- 在AngularJS应用中实现认证授权
- OpenCV2:Mat属性type,depth,step
- Scanner用法详解
- 【IOS 开发学习总结-OC-52】UITableViewDelegate详解
- Java中如何遍历Map对象的4种方法
- iOS开发-UI控件:如何画1像素的线
- Angularjs 通过asp.net web api认证登录
- 开发网站合集