涉及到敏感数据的项目都会面临数据加密的问题,下面说一下我们项目中的一些选择和实现
- 传输加密
我们平时碰到的最多的场景可能会是传输过程中的加密,这种加密保证的是传输过程中的信息的私密性避免敏感信息被截获,如用户注册过程中是的私人信息、或是我们在使用即时通讯工具传输的私人信息等。
如果信息过于敏感和重要如涉及身份证通讯地址和手机号码等我们采用RSA+AES结合的方式来保证安全性,这种场景下信息是从用户端产生传输到服务器端的我们要保证的是传输的安全,用户端已经获得了RSA的公钥,用户端需要产生AES的密码,为了安全性可以在每次与服务器端交互时都产生一个不同的密码,生成密码后将关键数据使用AES+密码来进行加密,然后再将刚才生成的密码使用RSA公钥进行加密,然后一起组装成请求体发送给服务器端。
如果此时消息在中间被拦截,因为消息使用了AES加密且密码是通过RSA公钥加密的,AES密码没有RSA私钥无法解密,所以拦截者无法破解消息内容。
服务器端拥有RSA的私钥,因此在接收到消息后,服务器端进行RSA私钥解密获取AES密码,然后根据密码再来通过AES解密获得请求体中的明文,从而完成整个消息的保密传输。 - 验签
对比上面的场景,验签所需要担心的不是消息被拦截后破解的问题,而是担心用户请求的身份识别问题,比如在一个支付场景中,用户要从自己账户中转账给其它用户,这时候我们最需要确认的是请求的确是用户自己发出的,这种场景下就要用到我们常说的验签,通常验签是通过RSA算法来进行保证。
一般实现是这样将用户的消息体用RSA公钥来签名,将签名内容附加在请求体中传给服务端,服务端通过私钥来验证签名,签名验证通过即认为请求是真实用户发出的。 - 存储加密
除了传输时的加密,在数据库中的数据在等保中也要求对自然人信息进行加密,这样防止的是数据库级别的泄漏。这时我们会采用AES加密,mysql中也提供了相应的加密解密函数方便我们直接使用: AES_ENCRYPT() AES_DECRYPT(),但加密后的数据存储空间为增加,性能会有一定的损耗,而且做模糊搜索可能会很麻烦。
很多场景可能我们使用AES和RSA都可以或是需求结合使用才能满足安全需求,这时我们要做适当的选择,因为AES的性能比较高,RSA性能较差,所以如果没有特别高的要求尽可能使用AES来满足需求。