随机数认证
① 为什么采用随机数可避免重放攻击
单独的随机数不能避免重放攻击,随机数一般会和签名加密技术,后台验证技术混合以提高破解和重放难度。
重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(Freshness Attacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。
从重放攻击的定义上我们可以看到,重放攻击提交给服务器的数据是曾经有效的,如何防止这种数据,对特定信息给与一个特定的随机数,并且这个随机数保存在服务器内,在验证了用户信息前,首先会对随机数进行验证,如果发现提交的随机数和服务器保存的不同则,该条信息无效通过这种方法来防止重放攻击。
常用的防御重放攻击,不会直接暴露随机数,一般随机数会用在MD5,HASH(数字签名)上,比如在对有效值进行MD5加密时添加随机数,如用户名为test,密码为test的MD5加密过程可能为MD5("test","test",随机数),这样在直接传输时不会暴露出随机值,黑客在提交重放攻击时系统发现MD5签名和系统签名计算后不同则,可被认定为重放攻击。
当然矛和盾是一种存在的,有可能该值刚好又一次的分配给了该用户,可能会重放攻击成功,但这个概率在科学计算上可以被视为0,而且随着随机数的位数的提高,概率会不断降低。
② 有哪位好心大神帮帮忙,告诉一下我这道题的的思路过程,在此谢了 使用随机数实现一次性口令认证过程代码
那客户端就需要联网使用。比如,客户端称为A,服务端成为B。A有编号,并且编号有在B注册内。A发给B的信息,B就能知容道是谁发送过来的。A在一分钟之内产生一个随机数。并且这个随机数通过加密发送给B。之后用户在一分钟之内通过这个随机数 登录,修改密码操作等等 B就能通过。超过一分钟B就将该随机数置空,这时候这组随机数就失效。不知道这样的想法可行不
③ CA证书没法用提示“签名失败”如何解决
可能是插件没有安装,估计是由计算机防火墙造成的,因为许多税务部门的插件没回有微软的认证,所以答防火墙会阻止自动安装。
1、首先安装驱动程序,然后插入USBKEY。
2、在第一次安装之后,操作系统没有重新安装之后,每个声明之后只会将密钥插入到USB接口中。如果您的计算机重新安装了操作系统,您需要重新安装软件以使用证书。
3、当您登录到在线声明系统时,请不要将其他业务部门密钥、加密狗、银行密钥和其他设备插入USB接口。
4、当登录和声明时,请不要从USB接口删除键。
5、成功登入及申报系统后,请尽快填写回款表。如果没有成功地完成超过30分钟,每个返回页面都应该登录并填写。
④ 如何理解CPU卡内部认证与外部认证
用户卡和机具进行双向认证
问题的提出:
1、传统的“对暗号”
经典片断:
问:天王盖地虎
答:宝塔镇河妖
互相握手,拥抱,同志呀同志!可终于找到你了
相信大家一定看过间谍电影中地对暗号片断,但是暗号容易被敌人窃取,于是有了革命者惊险或悲壮的故事,当然了其中不乏有叛徒的出卖。
安全分析:
对暗号中容易出现暗号被第三方窃取的情况,其中存在很大的安全隐患,相信大家一定印象深刻,深有体会。
2、密码学中对“对暗号”的借鉴
在传统的对称密码学体系中,用密钥来代表双方的暗号
暗号=密钥
当然了,暗号越复杂,即密钥长度越长越安全
但暗号太复杂,越不容易记住,所以实际应用中密钥长度也不会太长(现在比价流行使用128位的密钥)
至于对称密码算法:CPU卡中使用的一般为3DES(112位),其它的128位的如IDEA、AES等
3、密码学中的双向认证的实际做法
由于直接对暗号存在不安全的隐患,所以密码学中并不直接判断两个密钥是否相等
而是采取一次一密的情况。
什么是一次一密呢?
就是:
1、每次都由一方产生一个随机数
2、双方都用密钥计算随机数得到一个值
3、比较随机数的计算值是否相等
这样就避免了密钥泄露的问题,因为每次得到的都是临时值,所以每次都必须去计算随机数,而
密钥又是被读出的,只能用来计算(通过使用指定的密钥标识来计算)。
所以就算泄露了随机数的计算值也没关系,因为下一次这个计算值并不能被使用。
4、CPU卡中的双向认证的实现
实体:CPU卡 机具
CPU卡中存放一个密钥
机具中存放和CPU卡相同的密钥
CPU卡外部认证步骤:
1、CPU卡产生一个8字节随机数送给外部程序,CPU卡临时保存随机数在卡内
2、外部程序把8字节随机数送给机具,机具用密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给CPU卡
4、CPU卡在卡片内部解密8字节随机数得到随机数明文,
5、CPU卡在卡片内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则外部认证成功
所以外部认证是CPU卡认证机具。
机具内部认证步骤:
1、机具产生一个8字节随机数送给外部程序,机具临时保存随机数在机具中
2、外部程序把8字节随机数送给CPU卡,CPU用内部认证密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给机具
4、机具解密8字节随机数得到随机数明文,
5、机具在内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则内部认证成功
所以内部认证是机具认证CPU卡
这样机具和CPU卡从而达到了双向认证
5、密钥的分散问题
由于一个机具必须可以认证n张卡片,而每张卡片的密钥都不相同
一般的想法:必须有n个机具对应n张卡片,但是这样代价太高,也不现实
密码学中提出了一个方法,即密钥分散的方法。
即机具中存放的是用户卡的母密钥,每次认证的时候,由母密钥根据用户卡的标识
计算得到用户卡的密钥。
⑤ cpu卡怎么实现des加解密数据
用户卡和机具进行双向认证
问题的提出:
1、传统的逗对暗号地
经典片断:
问:天王盖地虎
答:宝塔镇河妖
互相握手,拥抱,同志呀同志!可终于找到你了
相信大家一定看过间谍电影中地对暗号片断,但是暗号容易被敌人窃取,于是有了革命者惊险或悲壮的故事,当然了其中不乏有叛徒的出卖。
安全分析:
对暗号中容易出现暗号被第三方窃取的情况,其中存在很大的安全隐患,相信大家一定印象深刻,深有体会。
2、密码学中对逗对暗号地的借鉴
在传统的对称密码学体系中,用密钥来代表双方的暗号
暗号=密钥
当然了,暗号越复杂,即密钥长度越长越安全
但暗号太复杂,越不容易记住,所以实际应用中密钥长度也不会太长(现在比价流行使用128位的密钥)
至于对称密码算法:CPU卡中使用的一般为3DES(112位),其它的128位的如IDEA、AES等
3、密码学中的双向认证的实际做法
由于直接对暗号存在不安全的隐患,所以密码学中并不直接判断两个密钥是否相等
而是采取一次一密的情况。
什么是一次一密呢看
就是:
1、每次都由一方产生一个随机数
2、双方都用密钥计算随机数得到一个值
3、比较随机数的计算值是否相等
这样就避免了密钥泄露的问题,因为每次得到的都是临时值,所以每次都必须去计算随机数,而
密钥又是被读出的,只能用来计算(通过使用指定的密钥标识来计算)。
所以就算泄露了随机数的计算值也没关系,因为下一次这个计算值并不能被使用。
4、CPU卡中的双向认证的实现
实体:CPU卡 机具
CPU卡中存放一个密钥
机具中存放和CPU卡相同的密钥
CPU卡外部认证步骤:
1、CPU卡产生一个8字节随机数送给外部程序,CPU卡临时保存随机数在卡内
2、外部程序把8字节随机数送给机具,机具用密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给CPU卡
4、CPU卡在卡片内部解密8字节随机数得到随机数明文,
5、CPU卡在卡片内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则外部认证成功
所以外部认证是CPU卡认证机具。
机具内部认证步骤:
1、机具产生一个8字节随机数送给外部程序,机具临时保存随机数在机具中
2、外部程序把8字节随机数送给CPU卡,CPU用内部认证密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给机具
4、机具解密8字节随机数得到随机数明文,
5、机具在内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则内部认证成功
所以内部认证是机具认证CPU卡
这样机具和CPU卡从而达到了双向认证
5、密钥的分散问题
由于一个机具必须可以认证n张卡片,而每张卡片的密钥都不相同
一般的想法:必须有n个机具对应n张卡片,但是这样代价太高,也不现实
密码学中提出了一个方法,即密钥分散的方法。
即机具中存放的是用户卡的母密钥,每次认证的时候,由母密钥根据用户卡的标识
计算得到用户卡的密钥。
⑥ 求java题目解答:随机数窗口(验证码)
这是我原来总结的一个实现验证码的三个跳转文件,希望能对你有帮助
产生验证码图片的文件-----image.jsp-----------------------------------
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
---------------使用验证码图片的文件---------a.jsp------------------------------------
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>认证码输入页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系统产生的认证码:</td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>输入上面的认证码:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交检测"></td>
</tr>
</form>
</body>
</html>
-----------------验证的页面----------check.jsp-----------------------------------------
验证根据需要 直接判断request中的验证码和session中的是否一致就可以了
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>验证页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<%
String sRand = (String)request.getSession().getAttribute("rand");
String rand = request.getParameter("rand");
%>
<%
if(sRand.equals(rand)){
out.print("Successed!");
}else{
out.print("Failed!");
}
%>
</body>
</html>
⑦ 按键精灵开发者认证5级问答题,求高手!(随机生成一个0-10之间的数字,让用户进行猜测...)
简单,你已经问了很多5级考试的问题了,说句你不爱听的话,你的水平不足以考这个等级,内我六级容的题目都会做(我看过,不过我没去考),不知道你考这个等级有啥用,我觉得没啥用就不考了。这道题的0-10应该是指整数(如果不限制这点没啥意义),这里的“三次没有猜中”的意思应该是,三次之中至少有一次猜中,就算成功的。代码如下:
r = 0 //记录答对结果次数
For i = 1 To 3
Randomize
RndNumber = Int(11 * Rnd)
InputNumber = InputBox("请输入0-10的整数")
If Clng(InputNumber) = RndNumber Then
r = r + 1
MessageBox "猜测成功!"
Exit For
End If
Next
If r = 0 Then
MessageBox "三次没有猜中,猜测失。"
End If