OneCode —— 让密码验证更简洁、优雅
灵光乍现
大概是在一个月之前,晚修结束后,我回到宿舍洗澡时,突然间想到的一个很有意思的点子。在密码验证的时候,我们是否可以仅动态生成一个六位数字进行身份验证。这个灵感应该是来自于学而思登录 ICS 系统时要求教师输入 4 位临时密码。乍一看这个 4 位密码不仅短并且还全是数字,安全性完全得不到保障。事实上在学而思内部确实如此。但,如果我们加入随机生成密码,并且在生成后一段时间后自动过期,密码使用一次后自动过期等机制,那就完全不一样了。
正是秉着这个想法,我快速洗完澡出来,拿出纸笔将重要的构思要点记录了下来。
终于,她—— OneCode 诞生了。
为何安全?
正如上文所提到,OneCode 生成的密码会自动过期。而自动过期的时间是在五分钟后,也就是说,在密码生成的五分钟后,整个系统相当于是无密码状态,是完全没有任何可能性进行登录的。将密码设置的十分冗长,虽说是不易被破解,但还是有能够登录进入的可能性。而 OneCode 使得系统在你不使用的时候是完全无法登录的,从根源上解决了问题。顺带一提,OneCode 的密码文件是加盐哈希后写入在 JSON 文件中的,这也就意味着其实任何人都可以看到被加密后的密码。但,这并不能说明其不安全。即使将 Google 全部的服务器调用起来运算破解,也不可能在五分钟之内破解完啊。
基本思路
详细的程序思路以及框架可以见 GitHub 上 README 文档。https://github.com/wuhan005/OneCodeOneCode 是以 API 的形式进行调用的。所以你可以使用 ajax 来进行无刷新验证&请求密码。
1. 生成新的 OneCode
POST https://www.yourwebsite.domain/GenerateKey.php
请求参数
token
(在 config.php 中设置)key
(在 config.php 中设置)
返回值
CODE
200
(成功 返回为新OneCode)501
(错误)
Message
(信息提示)2. 验证 OneCode
POST https://www.yourwebsite.domain/AuthKey.php
请求参数
onecode
返回值
CODE
200
(成功)501
(验证错误)502
(OneCode尝试次数用尽)503
(OneCode已过期)
Message
(信息提示)Authorization Error!
验证错误The Key is Not Available.
OneCode尝试次数用尽Overtime!
OneCode 已过期
3. 配置相关(config.php)
$_salt
(加密所使用的 Salt 值)$_token
(验证用 Token)$_key
(验证用 Key,建议为4位数字)
目录文件
- AuthKey.php 验证 OneCode
- GenerateKey.php 生成新的 OneCode
- OneCode.json 用于储存OneCode
- config.php 配置文件
写在最后
其实在宿舍洗澡构思 OneCode 时,我一直纠结的居然是她的 Logo!本来是打算做成一个锁的样子,在镜子上的水雾上尝试着设计,效果都不理想。之后在 PS 上,将英文一打,换个颜色和字体,居然拼出了一个钥匙的形状!可能都没能看出来吧,哈哈。这个钥匙的形状恰好象征着密码、验证。很棒。至于 OneCode 这个名字,可能有的人会联想到著名的 1Password 密码存储软件。确实是有些相似,但这两者的用途完全不同。
收获与提升
首先是在电视台和黄老师偶然聊到了兔子数列(斐波那契数列),她说这个在密码学其实有很多应用。所以我在想能否加入到 OneCode 中去。这次在 GitHub 上写了格式十分规整的 README 文档。对 MarkDown 的语法也掌握了很多,以后尽可能做到不翻语法文档也能流畅写下来。
嘛,大概就是这样啦。
谢谢老板 Thanks♪(・ω・)ノ
喜欢这篇文章?为什么不打赏一下呢?