随机算法在APP安全中的重要性

在展开文章之前,先给大家看一段代码:

坑 is here

<?php  
// 登录
$uid = $_POST['uid'];
$token = time() . rand(1000, 9999);
$token = md5($token);
$redis = new Redis();
$do = $redis ->setnx('Auth:' . $token, $uid);
if( !$do )  
    $app->response("Sorry, server is busy...");
$app->response("Hello, ".$uid."'s auth token is ".$token);
<?php  
// 验证凭具
$token = $_POST['token'];
$redis = new Redis();
$uid = $redis ->get('Auth:' . $token);
echo "Hello, You are logged in as ".$uid;

分析

上述代码, 逻辑上并无太大问题,一般业务一秒钟能登录超过8999个用户的可能性也不太大,所以基本上能满足大多业务的APP授权需求。

可是这块代码真没有安全问题吗?

有。

随机生成算法太弱。

假设小明同学在1464158564这个时间点登录了应用,那么 md5( "1464158564" . rand( 1000, 9999 ) ) 中,除去了时间戳外就只有1000~9999是破解的变量了。只需猜8999次即可获取小明的账户权限。

改进建议

首先将随机因子加多,头部加尾变也加,然后长度远远大于可猜解的范围,加大暴力破解难度。

哈希算法改成非哈希算法,比如php的password_hash()函数替代md5(),相同因子不同次生成的密文不一致,即可以一定程度避免重复,也能无限维度加大破解难度。

<?php  
// 登录
$uid = $_POST['uid'];
$token = rand(10000000, 99999999) . time() . rand(10000000, 99999999);
$token = password_hash($token, 1);
$redis = new Redis();
$do = $redis ->setnx('Auth:' . $token, $uid);
if( !$do )  
    $app->response("Sorry, server is busy...");
$app->response("Hello, ".$uid."'s auth token is ".$token);
<?php  
// 验证凭具
$token = $_POST['token'];
$redis = new Redis();
$uid = $redis ->get('Auth:' . $token);
echo "Hello, You are logged in as ".$uid;  

来源: IT乐吧: 随机算法在APP安全中的重要性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值