1、什么是加密算法

所谓加密算法就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段密文,使其只能在输入相应的密钥之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。

2、加密算法的分类

加密算法具体而言可分为以下三类:

  • 信息摘要算法:又叫哈希算法(hash), 不可逆, 常用于不需要解密的场景。
  • 对称加密算法:加密和解密的密钥是一样的。
  • 非对称加密算法:加密和解密的密钥是不一样的。

注意:上述的对称加密和非对称加密又有人称之为双向加密(存在加密和解密的过程)。

hash算法

加密过程不需要密钥,常见的加密散列算法有MD系列和SHA系列。

一个理想的加密散列函数应该具备以下特性:

  • 任何信息传入后,输出的总是长度固定;
  • 消息摘要看起来是“随机的”,这样根据原始信息就很难推测出值;
  • 好的散列函数碰撞概率应该极低,也就是不同信息传入后得到相同值的概率;

对称加密与非对称加密

常见的加密算法如下:

  • 对称加密:DES、3DES、AES、RC4
  • 非对称加密:RSA、DSA、ECDSA

对称加密的优缺点:

  • 优点:加密解密快、紧凑(加密前后数据大小变化不大)
  • 缺点:密钥管理和分发困难,不够安全

非对称加密的优缺点:

  • 优点:解决密钥管理和分发问题,实现对数字签名的需求
  • 缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密

3、加密算法在开发中的使用

主流语言的密码库

加密算法推荐使用各个编程语言自带的密码库去实现,我列举一下常见编程语言的密码库,有需要学习的同学自行了解:

  • Java: Java内置了java.security、javax.crypto、javax.net.ssl这些跟加密相关的模块,有兴趣自己了解。
  • JavaScript: node.js自带crypto模块,提供了哈希、对称加密以及非对称加密。
  • Python: Python提供了诸如hashlib、zlib、hmac等标准库。另外python的扩展库pycrypto和cryptography在加密算法方面做的更加完善。
  • Golang: Golang里面自带crypto模块,提供多种加密算法,有兴趣可自己了解。

日常开发注意事项

在日常开发中要对诸如密码、手机号、身份证号码这些敏感信息进行加密处理,如果是手机号、身份证号这种需要双向加密的,就应该使用诸如AES、DES能够快速加解密的对称加密算法,如果是密码这种只需要单向加密(防泄露即可),可使用诸如MD5、SHA1等不可逆的哈希算法。

在上一段描述的场景下,只是杜绝敏感信息以明文形式存储在数据库,防止黑客攻击把用户的所有信息一窝端的情况下泄露了用户隐私,在实际的业务处理过程中除了密码这样的信息其他信息若是密文一般都会解密出来再进行处理。

然后还有一个问题就是前端有没有必要加密数据?答案是没有必要,因为客户端的代码很容易被分析,这种情况下有没有加密其实都没有什么用,你想一下你怎么加密的都被人家分析出来了,人家拿走你的密文,你就算加密了那有什么用?