一,S/KEY是什么
S/KEY是一种一次性密码系统,可用场景较多,在下文具体分析。理想环境下,S/KEY密码长度决定安全性,在现实环境中,S/KEY存在诸多薄弱安全性环节。
二,设计思想
放上来自Wiki的身份验证图:
放上教学案例图:
我理解的SKEY流程:(以web实现为例子)
1.注册:
客户发送“用户名+密码”到服务器。服务器将“用户名+密码”与不重复产出的字符串拼接(我使用时间戳)。
服务器将拼接后的字符串做多轮 function_HASH 运算(我使用国密SM3杂凑算法为基础)。其中function_HASH需要满足 A . 产生连续若干轮结果,写入文件(文件不在服务区保存,直接交给客户) B . 足够长,满足计算不可破译基本要求 C . 满足连续结果 HASH(n)和 HASH(n+1)有function_HASH(HASH(n))==function_HASH(HASH(n+1)) 。
服务器将多轮function_HASH产生的HASH值中最后一轮结果保存到数据库,将带全部结果的文本发给用户,完成注册流程。
2.登录:
客户登录时,输入“用户名 + HASH值“,其中HASH值为从倒数第二轮开始的一个值,下一次使用倒数第三个,直到用完。
在服务器端:每一次获得”用户名 + HASH值“,视为一次挑战,数据库检索用户名对应HASH值,将用户发来的HASH值进行一次function_HASH运算,满足HASH相等,则通过,将原数据库中HASH项更新为用户新发出的HASH值。
为了避免HASH值泄露,服务器可在挑战成功后返回一个较长cookie,将“cookie+用户名+用户IP”保存到数据库,用户可凭借自己的cookie从服务器索要数据。
三,具体实现
实验环境:
Debian 11.1 64bit(Linux)
apache 2
云服务器
域名 www.omegarea.com
maria_DB 数据库
1.单轮function_HASH
思想:PHP调用C++程序,C++程序为字符串的SM3杂凑,字符串为”ID + Password + time“
SM3杂凑具体实现请参照 GB/T 32905-2016 信息安全技术 SM3密码杂凑算法
php调用方法:
1.将源C++(C)程序编译到指定文件夹
//在命令行中使用
cd /源文件目录
gcc test.c -o test //编译C,test.c 为源文件,test 为自己命名的新生成可执行文件
g++ test.cpp -o test //同上
若源文件含有多个文件,如头文件,动态链接库,需要在编译时附上,如下
g++ test.cpp func.cpp -o test //我使用了func.h,故需要加上func.cpp
2.调用可执行文件
$command='程序位置+程序名+入口参数'
$result= exec($command);
SM3中通用数学高效算法 ( 针对大数据处理 )
首先:加密需要用字符串储存数据,longlong , int , unsigned int 处理数据为下下策
1.十进制转换二进制
思想:
原理:(Dec为十进制)
2. 二进制字符串的算数加法运算
原理:两字符串低位对齐后补齐高位,同位做异或运算,同为1时记录进位到carry表,将结果与carry表再异或,产生新的carry表,直到新carry表为空。
四,需要注意的细节
- php调用外部文件会被服务器当作高危风险,做好文件备份,避免文件被安全系统删除
- 数据库中varchar变量长度低于512,长字符串用text数据类型
- 在用户注册生成HASHfile后,先发送给用户,后删除文件,避免文件重写或无法新建文件
- Linux系统需要打开文件夹写入权限,被调用的外部加密可执行文件需要设置权限777
- 数据库优化,将用户ID先HASH,检索数据库时先检索ID_HASH
- 不要将所有数据写入一张表格,使用多张表格
- SKEY是有登录次数限制的,在HASH文件使用结束后,需要向服务器重新申请或者重新注册账号
五,S/KEY在web使用的安全性分析
安全分析:
SKEY用户的HASH密钥不应该保存为cookie,若cookie无意间删除,用户会永久性失去登录机会,故我将服务器生成的HASH表保存到文件。
可以在服务器端用用户初始密码作为HASH文件加密密钥,发送密文文件到用户,公开解密应用,用户在登录时用自己密码解密将要提交服务器登录用的一次性密钥,做到离线安全,同时不浪费用户初始密码。
SKEY系统薄弱环节为用户注册,故应该在前端用JS将对话加密,在服务器端解密,使用公钥系统,服务器持有私钥,前端公钥。
SKEY无法避免对话截断后(未到达服务器)重放的攻击,所以必须记载用户的IP地址以及其他用户特征,一旦发送的密钥正确但特征改变,立马跳过该密钥拒绝登录。
应用场景分析:
1.SKEY在高算力的移动端与PC端用处不大,实时计算且可离线使用的OPT动态口令远比SKEY优秀
2.我认为SKEY在低端物联网设备上将占据重要一席:低端物联网出于电池续航,算力,发热等一系列因素,先天不适应实时计算,但物联网设备通点就是大部分有网络连接和记忆存储功能,而SKEY本就只需要记忆体与网络。一个不需要极高安全性的物联网设备,只需要在制作时加载一定量的SKEY_HASH密钥与加密存储芯片即可以高安全标准进行数据传输。
3.物联网设备是真实存在于三维世界,只要一次性压入的密钥值使用时间约等于人工对物联网设备维护的周期,那么可以极大降低物联网SKEY业务边际成本。