常用术语:
加密:encryption 解密:decryption
秘钥:secret key (公钥:public key 私钥:private key)
数字签名:digital signature
数字证书:digital certificate
摘要:digest
可以参考的文章:What is a Digital Signature? (翻译:数字签名是什么?)
一、Base64
Base64也不是加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。
更多Base64相关知识可参考博客:base64
二、散列
常见的散列算法有MD5、SHA1、HMAC。散列算法并不是加密算法。
1.md5(Message-Digest Algorithm 5)
密码通常用md5算法加密,虽然不能通过逆向的方式恢复成明文,但是却可以通过碰撞的方式得到原密码或者替代密码。
(简单具体例子,假设密码是数字2,而hash算法是对原数字进行平方运算,2的平方为4,实际上我们不需要也不可能通过逆向得到原密码2,但只需要找到其替代值-2就足以。)
md5加盐
盐,是一串比较复杂的字符串。加盐的目的是加强加密的复杂度,当然这个“盐”越长越复杂,加密后破解起来就越麻烦。加盐并不表示就安全了,“盐”也可能被泄漏出去。
另外,加盐也不一定加固定的盐。
2.SHA1(Secure Hash Algorithm)
SHA-1密码算法,由美国专门制定密码算法的标准机构———美国国家标准技术研究院与美国国家安全局设计,早在1994年就被推荐给美国政府和金融系统采用,是美国政府目前应用最广泛的密码算法。
3.HMAC(Hash Message Authentication Code)
散列消息鉴别码,基于密钥的Hash算法的认证协议。
补充:王小云和她的研究小组已经宣布,成功破解MD5和SHA-1等加密算法。实际上并不是真正意义上的破解,只是提高了碰撞效率。
三、对称加密和非对称加密
1.对称加密
对称加密就是通信双方使用相同的秘钥加密解密。
对称加密算法有DES、3DES(TripleDES),DESede、AES、Blowfish,以及RC2和RC4算法,还有其他第三方提供的软件包提供的Bouncy Castle 提供的IDEA算法。
这里面DES算是最经典的算法,DESede是DES算法的变种,AES算是DES算法的替代者;
AES(Advanced Encryption Standard)
AES翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。但是因为AES加密算法的安全性要高于DES和3DES,所以AES已经成为了主要的对称加密算法。
更多对称加密算法的知识可参考博客:对称加密及AES加密算法
2.非对称加密
非对称加密使用一对密钥:公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。
公钥和私钥是成对出现的,它们可以互相解密。公钥加密的内容,只有私钥可以解密。私钥加密的内容,只有公钥可以解密。
(公钥加密私钥解,私钥签名公钥验证。 )
主要的非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法
3.选择对称加密还是非对称加密
截取一段内容,来自对称加密及AES加密算法
四、数字签名和数字证书
1.数字签名
非对称加密算法的效率是非常低的。
将内容使用hash函数生成摘要,再用私钥对摘要进行加密,生成数字签名。然后将内容附上数字签名一同传输。
收件方收到后,用公钥对数字签名进行解密,得到摘要,然后再对原内容进行hash生成摘要,比对这两个摘要是否相同,相同则说明内容没有被篡改。
2.数字证书
由CA颁发给网站的身份证书,里面包含了该网站的公钥,有效时间,网站的地址,CA的数字签名等。
所谓的CA数字签名,实际上就是使用了CA的私钥将网站的公钥等信息进行了签名,当客户端请求服务器的时候,网站会把证书发给客户端,客户端首先可以通过CA的数字签名校验CA的身份,也能证明证书的真实完整性。客户端有没有可能到一个假冒的CA去校验数字证书呢?不太可能,因为CA的地址是内嵌在浏览器中的,很难被篡改。
3.数字证书管理工具
keytool和openssl都是证书管理工具。openssl和keytool的区别可以参考数字证书管理工具openssl和keytool的区别
keytool
keytool是Java自带的数字证书管理工具,用于数字证书的生成,导入,导出与撤销等操作。它与本地密钥库关联,并可以对本地密钥库进行管理,可以将私钥存放于密钥库中,而公钥使用数字证书进行输出。keytool位于jdk安装目录的bin文件夹下。
openssl
openssl官网地址:https://www.openssl.org/
待补充:使用keytool和openssl生成自签名证书步骤
总结:
对称加密与解密使用的是相同的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
非对称加密使用了一对密钥:公钥与私钥,所以安全性高,但加密与解密速度慢。
通常的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方仍然可以使用对称加密来进行沟通。