接触 Golang 编程语言有一段时间了,从已上手的几个 WEB 程序和小工具而言,go 语言逐渐成为我心中最爱的编程语言。最近开发的一个商用程序里,需要处理一些加密内容,本篇就来详细总结下有关加密的一些知识。内容听取了评测视频及解说,然后根据自己实际接触的场景进行整理,淘汰过时或不安全的,直接以实际应用场景为题。
0. 以校验为目的哈希值
哈希值有什么用?常见于哪些场景呢?以常见的 MD5 加密为例,我们常见的很多 API 接口(比如 KMFAKA 程序里集成的各种支付接口,几乎 90%的接口都用 MD5 进行校验),请求时,都会把各种参数排序组合,然后计算 md5 值并传递给服务器,服务器再以同样的方式进行验证,以校验数据是否被篡改。还有阿里云盘上传时会将文件分割并计算校验码,如果计算的校验码已存在云端,则该文件为秒传。
实际商用程序中,我们会在普通访客写入数据库的步骤上,会加一个校验,配合前端混淆的 js 加密,不仅可以防止数据被篡改,还可以防止仅通过 API 进行的恶意写入。以 SHA1 为例,
为防止破解,一般我们还会加盐处理,可用随机字符串或时间盐,这些参数是需要一并传递的。由于是字符串加密,还可以自我排序,外加几个固定参数以提高安全性。
1. 以加密解密为目的加密方法
A. 简易的明文编码(Base64)
此类方法一般具有降低可读性和压缩代码的作用,比如Ascii、GBK、Unicode、Base64
等编码,其中Base64
几乎出现在每个加密程序里,简单来讲,Base64 就是一种用 64 个 Ascii 字符来表示任意二进制数据的方法。主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成 Ascii 字符。比如 go 语言中经常遇到的一些二进制内容,实际打印后效果为乱码,假如该数据要写入到数据库,可行吗?
同样的,Base64 还组合在 JWT 认证服务上,可以说是明文密码最直接的最常用的加密方式。
B. 密钥解密类(AES-GCM)
此类方法需要加密和解密共用一把钥匙才能处理数据,以 AES 加密为主,经历数次技术发展,其中又以 AES-GCM 为主流,它是一种能够同时保证数据的保密性、 完整性和真实性的一种加密模式。我在个人项目中,对关键信息都采用这种方法进行加密。由于数据库里存储的是加密后的数据,就算黑客拿到你的数据库,也无法破解加密后的内容。虽然加密操作很大程度上阻碍了我们快速观察数据,但是为了以防万一,加密存储是必须的。至于观察数据,则可以从其他维度进行判定后再解密。比如我最近写的商用发卡系统,敏感信息均作了加密处理,这种信息传递,如果是 Python 开发,可能会拖慢速度,但是 golang 这边完全不是问题。在实际测试中,20 条长加密信息处理消耗都是按微秒计算的,非常令人满意。
C. 公钥和私钥(RSA256)
这是一种非对称加密算法,两把钥匙相互加解密,简单而言就是,如果私钥加密->需公钥解密、如果公钥加密->需私钥解密。一般公钥是公开的,让用户使用公钥加密信息,然后所有数据仅持有私钥者才能解密,适合安全性最高的场景。比如存储一些公民身份信息的内容等。
2. 使用场景总结
速度上:明文编码 > MD5 > SHA1 > AES-GCM > RSA
综合而言,校验用 SHA,普通编码用 Base64,内部数据加密存储可用 AES-GCM, 最高安全直接用 RSA。
另外,一些敏感信息展示,还可以使用脱敏处理,比如姓名、身份证号、手机号脱敏处理等,可在后台搭配 AES 方法脱敏处理。
3. 一些使用感受
很多算法早在 1992 年左右就诞生了,时至今日,比较出名的算法少之又少,看来密码学领域不是花样繁多的一门学问,抛开背后的各种数学原理,现实需求就是从效率、安全方面评定的,其他因素都是次要的。很多时候,密码学都是等现有的不安全之后,再去尝试新的,比如 sha256 这类的算由于密码学专家的存疑,sha3 直接换算法思路了。信息安全方面,我们始终要保持一种超前的预判,该加密的必须加密,该脱敏处理的必须脱敏处理,唯有如此,才能在互联网上保障信息的绝对安全。