赞
踩
分为单向加密和双向加密。
单向加密 包括 MD5
,SHA
“加密” 算法等等。单向“加密”算法是不可逆的,也就是无法将加密后的数据恢复成原始数据,除非采取碰撞攻击和穷举的方式。像是银行账户密码的存储,一般采用的就是单向加密的方式。
这里的”加密“实际为摘要生成哈希值。
双向加密是可逆的,存在密文的密钥,持有密文的一方可以根据密钥解密得到原始明文,一般用于发送方和接收方都能通过密钥获取明文的情况。
双向加密包括对称加密和非对称加密。
非对称加密的意思是加密的秘钥和解密的秘钥不一样。
对称加密的意思是加解密用的是同一个秘钥。
对称加密包括 3DES、Blowfish、IDEA、RC4、RC5、RC6、AES
等,AES
加密主要包括两个步骤:密钥扩展和明文加密。
非对称加密包括 RSA加密,ECC加密。
软件加密也即cpu执行加密算法将明文变为密文,加密的过程需要传入的参数有、秘钥、数据地址等。
有些公司会单独实现硬件加解密 Engine 支持多种加/解密算法。
目前 armv8 架构里面已经支持硬件加解密,所以只需要配置相关的寄存器即可。
(1) 加密
对字符串 ‘abc’(明文) 进行 AES 加密,使用密钥 123,输出结果以 base64 编码格式给出:
# echo -n abc | openssl aes-128-cbc -k 123 -base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。base64要求将每三个8bits字节转换为四个6bit的字节(3 * 8
= 4 * 6 = 24),然后将转换后的6bit往高位添加2个0,组成4个8bit的字节,再根据这4个8bit字节的十进制在索引表中查找对应的值,此时得到的结果就是Base64值。Base64也起到了一定的加密作用(起码不是人一眼就能看懂的)
加密后的密文:
U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g=
(2) 解密
对以上密文进行解密处理:
# echo U2FsdGVkX18ynIbz...7jt4g= | openssl aes-128-cbc -d -k 123 -base64
解密结果
abc
若要从文件里取原文(密文)进行加密(解密),只要指定 -in
参数指向文件名就可以了。进行 des3
加解密,只要把命令中的 aes-128-cbc
换成 des3
就可以了。
一个 n 位的哈希函数就是一个从任意长的消息到 n位哈希值的映射,一个n位的加密哈希函数就是一个单向的、避免碰撞的n位哈希函数。这样的函数是目前在数字签名和密码保护当中极为重要的手段。
当前比较流行的哈希函数主要有128 位的 MD4
和 MD5
和160位的 SHA-1
1)对字符串进行md5摘要
对字符串 ‘abc’
进行 md5
摘要计算:
echo abc | openssl md5
2)对文件进行 MD5 摘要计算:
openssl md5 -in t.txt
使用 md5 进行签名的时候可以指定其他摘要算法, 太别扭了。建议做摘要和签名验证时使用 dgst 指令。
1). 对字符串 ‘abc’
进行 sha1
摘要计算:
echo abc | openssl sha1
openssl dgst -sha1 file.txt
安全散列算法2,是 SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
。
对于任意长度的消息,SHA256
都会产生一个 256
位的哈希值,称作消息摘要。这个摘要相当于是个长度为 32
个字节的数组,通常有一个长度为 64
的十六进制字符串来表示。因为 md5
和 sha1
有被碰撞和破解的可能性,所以使用 sha256
。
echo -n abc | openssl sha256
sha256
摘要计算:openssl dgst -sha256 file.txt
也是同样的命令
sha256sum
命令计算哈希值
SSL 是一个缩写,代表的是 Secure Sockets Layer
。它是支持在 Internet 上进行安全通信的 标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有 到达它预定的目标后才被解密。
先生成私钥,再由私钥产生公钥
(1) 私钥生成
openssl genrsa -out rsa_private_key.pem 1024
生成一个RSA算法私钥(genrsa),保存到(-out
)名为rsa_private_key.pem
的文件中。
这个命令还可以加上一些可选参数,如:
openssl genrsa -aes128 -out private.key 2048
-aes128
,将私钥以 AES-128
算法保护,另有-aes129
,-aes256
2048
: 指定私钥长度为2048
比特,默认是512
比特,但512
比特长度在现今技术环境下已不够安全(2) 公钥生成
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
genrsa 生成的文件并不包含公钥,但是包含了私钥的详细信息, rsa命令可以根据这个文件生 成对应的公钥。
生成私钥:
$ openssl genrsa -out privkey.pem 2048
生成公钥:
$ openssl rsa -in privkey.pem -pubout -out pubkey.pem
用公钥加密:
$ openssl rsautl -encrypt -pubin -inkey pubkey.pem -in test.txt -out test.txt.enc
-encrypt: 选项对明文进行加密;
-pubin: 选项告诉openssl通过;
-inkey: 选项传入的密钥为公钥,因为如果没有该选项,openssl默认认为-inkey传入的是私钥。
用私钥解密.
$ openssl rsautl -decrypt -in test.txt.enc -inkey privkey.pem -out test_decrypt.txt
结果: test_dec.txt 文件内容与test.txt内容一样
加密大文件(用户名及账户):
(1) openssl req -x509 -nodes -days 100000 -newkey rsa:2048 -keyout privatekey.pem -out publickey.pem
(2) openssl smime -encrypt -aes256 -in Readme.zip -binary -outform DEM -out LargeFile_encrypted.zip publickey.pem
(3) openssl smime -decrypt -in LargeFile_encrypted.zip -binary -inform DEM -inkey privatekey.pem -out LargeFile.zip
当用公钥来解密信息,确保信息是真的由具有私钥者发布的,且是完整正确的。这个过程被称作数字签名,公钥的形式就是数字证书。所以这种我们称之为加签和验签。
简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。
第一个场景:战场上,B要给A传递一条消息,内容为某一指令。
RSA
的加密过程如下:
1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
2)A传递自己的公钥给B,B用A的公钥对消息进行加密。
3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。
在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。
第二个场景:A 收到 B发的消息后,需要进行回复“收到”。
RSA签名的过程如下:
1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
2)A 用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。
3)B 收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。
在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有 A 的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。
见:【ARM 安全系列介绍 3.1 – 数字签名算法 ECDSA】
详情见:【ARM 安全系列介绍 3.2 – Base64 介绍】
见:【ARM 安全系列介绍 3.3 – DES3 详细介绍并举例应用】
一般证书有三种格式:
PEM
(.pem)前面命令生成的都是这种格式,DER
(.cer .der) Windows上常见PKCS#12
文件(.pfx .p12) Mac上常见(1)PEM转换为DER
#openssl x509 -outform der -in myserver.crt -out myserver.der
(2) DER转换为PEM
#openssl x509 -inform der -in myserver.cer -out myserver.pem
#openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
(3) PKCS转换为PEM
#openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。