博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务端应用安全——加密算法与随机数
阅读量:3944 次
发布时间:2019-05-23

本文共 2081 字,大约阅读时间需要 6 分钟。

0.基础知识

加密算法分类:

  • 分组加密

    将明文消息编码表示后的数字(简称明文数字)序列,划分成长度为n的组(可看成长度为n的矢量),每组分别在密钥的控制下变换成等长的输出数字(简称密文数字)序列
    代表算法:DES、3-DES、Blowfish、IDEA、AES等

  • 流加密

    明文数据每次与密钥数据流顺次对应加密,得到密文数据流
    代表算法:RC4、ORYX、SEAL

攻击者攻击方式:

  • 唯密文攻击
    攻击者只有使用同一加密算法和加密密钥加密的密文
  • 选择明文攻击
    攻击者有部分明文和密文,还能选择用于加密的明文。
  • 选择密文攻击
    攻击者选择不同的密文解密

1.流密码攻击:

广泛采用的authcode()流密码加密函数存在以下安全问题:

1.1 Reused Key Attack

使用同一密钥进行多次加密,此时攻击者不需要知道密钥,即可还原出明文。

原理:明文A和明文B,都利用密钥C进行异或加密:

E(A)=A XOR C
E(B)=B XOR C

E(A) XOR E(B)=A XOR C XOR B XOR C=A XOR B XOR (C XOR C)=A XOR B

而E(A)和E(B)很容易获得,如果知道A,即可得到B,而不需要知道密钥C。

2.2 Bit-flipping Attack

攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式,该种攻击方式称为Bit-flipping Attack

原理:A XOR E(A) XOR B=E(A) XOR E(A) XOR E(B)=E(B)

即知道明文A和明文B以及A的密文,就可以得到B的密文。

例子:攻击者新建普通用户A,获取A的cookie即E(A)后,就有可能利用同样的算法获得管理员admin的cookie

解决办法:

在传递的消息中增加带有KEY的消息验证码,从而验证密文是否被篡改。

在这里插入图片描述

弱随机IV问题:

authcode()函数中,默认使用4字节的初始化向量IV(密钥后增加的随机值,用来保证每次使用的密钥都不同)。4字节不够安全,会被使用暴力法破解。

2.WEP破解

WEP是一种常用的无线加密传输协议,破解了WEP的密钥,就可以连接到该Access Point。

破解原理:WEP加密采用24位的IV,但是仍然在数小时内可能出现重复的IV值,一旦IV重复,就有可能出现上述的Reused Key Attack。

具体流程可以参考:

3.ECB模式的缺陷

分组加密有多种加密模式(表征组间关系),例如:ECB、CBC、CFB、OFB、CTR等

ECB是其中最简单的一种模式:

在这里插入图片描述
最大的特点是组与组之间毫不相干:交换两个组的明文,对应的密文也会交换;其中一组的明文改变,只影响改组对应的密文。

危害:攻击者可能替换某一组的密文,从而攻击成功

4.Padding oracle Attack

该攻击针对CBC模式(上一组的密文作为下一组加密的IV),它可以在不知道密钥的情况下,通过对padding byte的尝试,还原明文,或者构造任意明文的密文。

padding指的是在对明文进行分组时,如果最后一组长度不够指定值,需要添加一些字符,被称为padding。padding规则为:当需要补几位时,即全部添加数字几的ACS码对应的十六进制值。

攻击者在知道加密算法和加密模式后,可以通过遍历IV的值,然后观察最后一组解密后的明文是否满足padding规则从而判断IV值是否正确,而得到IV值,进一步解密得到前面组的明文。

5.密钥管理

加密算法破解难度太高,一般人也做不到,所以攻击者往往想办法获取密钥,因此密钥管理至关重要。

最常见错误为将密钥硬编码进代码中!

对于WEB应用,常见正确做法:将密钥保存在配置文件或数据库,在使用密钥时,由程序加载进内存,然后通过控制配置文件或数据库的访问权限来保证密钥安全。

6. 伪随机数问题:

  • 系统时间:

PHP中microtime()函数,由微秒数和系统当前秒数合成,系统当前秒数便于获取,只需遍历微秒数,就可以暴力破解利用该函数生成的密码。

  • rand()和mt_rand()函数:

php4.2.0版本之前需要人为播种,之后系统自动播种,而种子一旦确定,生成的随机数就是确定的。

";echo rand()."
";echo rand()."
";echo rand()."
";?>

seed值确定后,刷新页面,每次获得的随机数都不变!!

在这里插入图片描述

所以种子的随机及安全很重要。

获取第一个随机数后猜测种子的思路:遍历

  • 安全的随机函数

Java:java.security.SecureRedom

Linux: int ran=open("/dev/random",O_RDONLY);或“/dev/urandom”目录
PHP:openssl_random_pseudo_byte()函数

小结:

在这里插入图片描述

MD5不安全,由于存在length extension Attack,可以在原文后附加任意内容并得到新的合法的MD5值。

转载地址:http://jrzwi.baihongyu.com/

你可能感兴趣的文章
ubutun里面用命令行安装软件
查看>>
ubuntu 常用命令
查看>>
SQLite Tutorial 4 : How to export SQLite file into CSV or Excel file
查看>>
how to move pivot to origin
查看>>
Optimizate objective function in matrix
查看>>
Convert polygon faces to triangles or quadrangles
查看>>
How do I divide matrix elements by column sums in MATLAB?
查看>>
read obj in matlab
查看>>
find out the neighbour matrix of a mesh
查看>>
Operators and special characters in matlab
查看>>
As-Conformal-As-Possible Surface Registration
查看>>
qmake Variable Reference
查看>>
Lesson 2 Gradient Desent
查看>>
find border vertex
查看>>
matlab sliced variable
查看>>
create symbolic array
查看>>
TAUCS库的编译(vs2010)
查看>>
color vector using in plotting example points and lines between corresponding vertices
查看>>
mex 里面调用matlab函数
查看>>
matlab中cuda编程中分配grid和block dimension的时候的注意事项
查看>>