加密解密相关概念
互联网上中间人攻击通常用的三种方式:1)窃听 2)数据篡改 3)会话劫持
密码算法协议的分类:
- a) 对称加密
常用的有:DES、3DES、AES、Blowfish、RC6、CAST5等
特性:1.加密、解密使用同一个密钥。
2.将原始数据分割成固定大小的块,逐个进行加密。
3.加解密速度快,密钥短。
- b) 非对称加密(公钥加密)
常用的有:RSA、DSA、DH
特性: 1.用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然。
2.公钥公开给所有人,私钥自己留存,必须保持其私密性。
其它一些介绍:
1.RSA可用于数字签名和密钥交换
2.DSA用于数字签名 (Digital SignatureAlgorithm)
3.基于大数运算的加密算法,降低了加解密的速度。一般来说只用于少量数据加密。一般采用对称加密算法加密其文件,然后用非对称算法加密对称算法所用到的对称密钥
4.DH仅适用于密钥交换
- c) 单向加密
常用的有: MD5、SHA-1、SHA224、SHA256、SHA384
特性:1.用于数据完整性校验
2.定长输出、雪崩效应
3.只能加密,不能解密,单向的运算
密钥交换算法:
DH算法只能用于密钥的交换,而不能进行消息的加密和解密。
DH 密钥交换算法的原理和过程如下:
有用户Alice 和Bob需要通信。
1.双方先确定2个大素数n和g,这两个数不能保密。
2.Alice再选择一个大随机数x,并计算A:A=g^x mod n
3.Alice将A发给Bob
4.Bob另外选择一个大随机数y,并计算B如下:B=g^y mod n
5.Bob将B发给Alice
6.计算秘密密钥K1,K1=B^x mod n
7.计算秘密密钥K2,K2=A^y mod n
最终结果一定是K1=K2,且K1、K2都没有暴露出来,因此Alice和Bob就可以用K1或者K2来进行加密和解密了。
公钥私钥的知识:
1,公钥和私钥成对出现
2,公开的密钥叫公钥,只有自己知道的叫私钥
3,用公钥加密的数据只有对应的私钥可以解密
4,用私钥加密的数据只有对应的公钥可以解密
5,如果可以用公钥解密,则必然是对应的私钥加的密
6,如果可以用私钥解密,则必然是对应的公钥加的密
公钥加密的2个功能:
1.身份验证/数字签名:【私钥加密数据,公钥来验证数字签名】
【例如:Alice生成两个数字,公钥a,私钥b。Alice用私钥b加密一段数据c(私钥签名),加密后结果为d,发给Bob,并告诉对方解密出的数据应该是c。如果Bob解密后确认是c,则一定是Alice发送的,因为能用公钥解密的数据,必然是对应的私钥加密的,私钥只有Alice存有,这样就确认了发送方是Alice,这个过程叫数字签名。】
2.数据加密:【公钥加密数据,私钥来解密】
【例如:Alice生成两个数字,公钥a,私钥b。将a发给Bob,告诉他这是公钥。这样Bob用公钥a加密了一段数据c,加密后的数据为d,放到网上,如果被人窃取了,但是没法被解开,因为不知道私钥b,只有Alcie自己知道私钥是b,只有Alice才能知道d解密后的内容。】
总结:
1,用公钥加密数据,用私钥来解密数据(数据加密)
2,用私钥加密数据,用公钥解密,来验证数字签名。在实际的使用中,公钥不会单独出现,总是以数字证书的方式出现,这样是为了公钥的安全性和有效性。
3. 由于公钥加密太费时间。一般只用在密钥交换时候,用公钥加密下。
下面的内容摘自博客:http://blog.itpub.net/21851324/viewspace-1023022/
SSL在通信中的应用:
Alice和Bob要进行安全的通信。很频繁,用公钥加密数据就不行了,原因:
1.Bob没有公私钥对,无法发消息(实际情况下,可以双方都有工私钥对)
2.公私钥加密都很费时间,影响速度。
Alice的公钥1是公开的,Bob找了个数字3,用Alice的公钥1,加密后发给Alice,说我们以后就用这个数字来加密信息吧,Alice解开后,得到了数字3,这样只有Alice和Bob知道这个秘密的数字3,别的人都不知道,因为他们既不知Bob挑了一个什么数字,加密后的内容他们也无法解开,我们把这个秘密的数字3叫做会话密钥。
然后,我们选择一种对称密钥算法,比如DES,(对称算法是说,加密过程和解密过程是对称的,用一个密钥加密,可以用同一个密钥解密),来加密我们之间的通信内容。别人因为不知道3是我们的会话密钥,因而无法解密。
【说明:对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密解密。只要通信需要保密,密钥就必须保密】
总结一下:
1,SSL实现安全的通信
2,通信双方使用一方或者双方的公钥来传递和约定会话密钥 (这个过程叫做握手)
3,双方使用会话密钥,来加密双方的通信内容
实际使用中,比上面说的还要复杂很多。好在先驱们已经实现了这层Layer,取名为SSL(Secure Socket Layer)
OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具
libcrypto: 公共加密库
libssl: 库,实现了ssl及tls
对称加密:
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc命令:【man enc查看详细帮助】
加密:
openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
openssl enc -e -des3 -a -salt -in fstab -out fstab
ciphertext -k 123456 #一步到位,设置密码为123456
解密:
openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
单向加密:
工具:md5sum, sha1sum, sha224sum, sha256sum,..., openssl dgst
sha1sum inittab 和 openssl dgst -sha1 inittab 的结果一样。
md5sum inittab 和 openssl dgst -md5 inittab 的结果一样。
dgst命令:计算消息摘要
如:openssl dgst [-md5|-sha1] FILE # 常用的两种计算摘要方式
openssl base64 -in file -out file.b64 # base64编码文件
openssl base64 -d -in file.b64 -out file.bin # base64解码文件
MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性
机制:
CBC-MAC
HMAC:使用md5或sha1算法
生成用户密码:
passwd命令
openssl passwd -1 -salt SALT 【-1 是数字1,不是字母,salt】
如:openssl passwd -1 -salt 123456
生成随机数:
openssl rand [-base64|-hex] NUM
支持-base64和-hex两种。
NUM: 表示字节数。-hex时,每个字符4位,出现的字符数为NUM*2;
如:openssl rand -hex 4 # 随机生成8位数的字符串
# 使用场景(如批量添加用户时,生成密码)
for ((i=1;i<=10;i++));do
useradd user$i &> /dev/null
p=$(openssl rand -hex 4)
echo $p |passwd --stdin user$i &> /dev/null
echo "user$i :$p" >>/tmp/add_user.txt
done
openssl加密命令基础:
生成密钥对儿:
# 生成私钥,再从私钥中提取出公钥。
openssl genrsa -des3 -out [私钥文件路径] [密钥长度] # 生成私钥,并对其进行des3加密【这样每次自己使用都要输入密码,一般都是有下面的这种】
(umask 077; openssl genrsa -out key.pri 2048) # 生成私钥,不带密码加密。安全起见,设置文件权限600
提取出公钥:
如:openssl rsa -in server.key -pubout > pub.key 【公钥文件权限644】
随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数;非阻塞;
常见的用法:
echo $RANDOM|md5sum #生成随机数
或者下面3种方式都能生成随机数:
date +%N
head -200 /dev/urandom | cksum | cut -d" " -f1
cat /proc/sys/kernel/random/uuid| cksum | cut -d" " -f1