AES和RSA的应用:混合密码系统
通过比较,我们知道:
RSA 比 AES 更难破解,因为它不需要担心密钥在传递过程中有泄露,只存在暴力破解一种可能;
AES的优势是以分组为轮,加解密速度非常快,一般而言,AES 速度上数百倍于 RSA
所以在实际应用中,我们会混合应用AES和RSA,比如 需要加密一个尺寸不小的文件,可能会这么干:
生成一个一次性随机密钥,算法上采用 AES 的CBC模式 aes-256-cbc(加密分组为256比特)对文件进行加密
加密完成后,为了安全的传递这个一次性随机密钥,我们使用 接收方的RSA公钥 对其进行加密,随加密后的文件一起发送
接收方使用私钥进行解密,得到AES密钥原文,并用其解密文件
例子
以上场景的应用,比如在 Node.js 中,可以这么实现:
(1) 生成 AES 随机密钥:1
2
3var passwdLength = 256; // 初始化随机向量长度
var aesPassword = require('crypto').randomBytes(passwdLength);
require('fs').writeFileSync('aesPassword', aesPassword); // 写入文件供openssl使用
(2) 使用openssl aes 加密 filename代表的文件:
openssl enc -aes-256-cbc -kfile aesPassword -in filename -out filename.out
(3) 使用open rsa 加密密钥
openssl enc rsautl -encrypt -pubin -inkey id_rsa.pub -in aespassword -out aespassword.out
将 filename.out 和 aespassword.out 一并发给对方即可,接收方使用openssl 进行一次逆操作即可实现解密。
- 选用AES算法,3DES需要三个密钥,且加密时间较长
AES算法密钥配置128长度即可
rails实现:(1)gem 安装aes GEM-AES地址:还是选用ase,github上的
(2)gem 安装aescrypt GEM-AES地址
(3)Open::SSL::Cipher
OPENSSL::PKey::RSA 加密算法
自行加解密自己来搞加解密,核心在于密钥的生成与管理,密钥管理方式有多种,主要有这么三种:
(1)固定密钥
服务端和客户端约定好一个密钥,同时约定好一个加密算法(eg:AES ),每次客户端im在发送前,就用约定好的算法,以及约定好的密钥加密再传输,服务端收到报文后,用约定好的算法,约定好的密钥再解密。这种方式,密钥和算法对程序员都是透明的。
(2)一人一密钥
简单说来就是每个人的密钥是固定的,但是每个人之间又不同,其实就是在固定密钥的算法中包含用户的某一特殊属性,比如用户uid、手机号、qq号等。
(3)动态密钥(一session一密钥)
动态密钥,一Session一密钥的安全性更高,每次会话前协商密钥。密钥协商的过程要经过2次非对称密钥的随机生成,1次对称加密密钥的随机生成,参考固态秘钥,用于加密的秘钥由客户端通过公钥加密发送给服务端,服务端使用私钥解密拿到后续通讯时使用改秘钥对信息进行加密
我尽量简单一些说,如果是大虾,就不用看了。注意,和具体的情况会有些不同,因为为了说明原理,简化了。
一.对称算法
AES
块加密和流加密
二.非对称算法
- RSA
三.Hash算法
- SHA
require ‘digest/sha1’
puts Digest::SHA1.hexdigest(‘admin’) - 不要把密钥存储在本地计算机上,应该使用密钥存储器