OneCode —— 让密码验证更简洁、优雅

OneCode —— 让密码验证更简洁、优雅

创意 1164 字 / 2 分钟

灵光乍现

大概是在一个月之前,晚修结束后,我回到宿舍洗澡时,突然间想到的一个很有意思的点子。在密码验证的时候,我们是否可以仅动态生成一个六位数字进行身份验证。这个灵感应该是来自于学而思登录 ICS 系统时要求教师输入 4 位临时密码。乍一看这个 4 位密码不仅短并且还全是数字,安全性完全得不到保障。事实上在学而思内部确实如此。

但,如果我们加入随机生成密码,并且在生成后一段时间后自动过期,密码使用一次后自动过期等机制,那就完全不一样了。

正是秉着这个想法,我快速洗完澡出来,拿出纸笔将重要的构思要点记录了下来。

终于,她—— OneCode 诞生了。

为何安全?

正如上文所提到,OneCode 生成的密码会自动过期。而自动过期的时间是在五分钟后,也就是说,在密码生成的五分钟后,整个系统相当于是无密码状态,是完全没有任何可能性进行登录的。将密码设置的十分冗长,虽说是不易被破解,但还是有能够登录进入的可能性。而 OneCode 使得系统在你不使用的时候是完全无法登录的,从根源上解决了问题。

顺带一提,OneCode 的密码文件是加盐哈希后写入在 JSON 文件中的,这也就意味着其实任何人都可以看到被加密后的密码。但,这并不能说明其不安全。即使将 Google 全部的服务器调用起来运算破解,也不可能在五分钟之内破解完啊。

基本思路

详细的程序思路以及框架可以见 GitHub 上 README 文档。https://github.com/wuhan005/OneCode

OneCode 是以 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 的语法也掌握了很多,以后尽可能做到不翻语法文档也能流畅写下来。

嘛,大概就是这样啦。