无论是客户端还是服务端的密钥,都需要找地方存储起来,使用时再拿出来用,那么存到什么地方,采用什么样的方式或介质来存储,是个关键,接下来客户端和服务端我们分开来说,各自应当怎么样存,才相对安全。

其实密钥要想安全,不被人知道,宗旨就是不要让别人能接触到、看到、获取到,也就是做到只能用,不能拿走,想办法把它放到黑盒子里,要加解密也好,签名验签也好,你把过程数据给我,黑盒子把加解密或签名验签结果给你,接触不到真正的密钥就是安全的。

# 服务端

先拿简单的来说吧,服务端安全的存储密钥是比较简单的,就是借助加密机,就是金融加密机,大家可以搜索一下。把密钥放加密机里,取不出来,只能用。

那有的同学说,我系统没那么复杂或没那么多资金去购买加密机(加密机还比较贵,一般要七八万,或十多万一台,容灾考虑呢一般都要多台),怎么办。

其实也能办,把握宗旨就行,就是把密钥放黑盒子里,别人只能用。这个黑盒子不一定非得是加密机,也可以是普通开发接触不到的服务器,只有个别人能登录,就是这个服务器的防护级别要做的非常高。

危险

现在大部分项目防篡改的私钥,都写配置文件里,这是非常危险的。这样不是每个开发都能看到,就算要放配置,也要区分测试环境和生产环境。 或者不要用配置文件,由配置中心下发,具体的项目代码不体现密钥这些敏感内容。安全的做法还是使用我上面提到的方案。

# 客户端

# Android

在安卓系统中,如果我们要存储密钥,可以使用KeyStore,先在KeyStore里生成AES或RSA密钥,但有其它密钥或敏感数据要存储时,由KeyStore里面的密钥加密后,存储到文件里,使用时再用KeyStore里的密钥解密后,再用。

对于KeyStore的特性呢,详细的大家可以搜索一下,其实它就像是一个黑盒子,只有APP自己能调用。

# iOS

iOS也有一个类似Android KeyStore的黑盒子,好像叫Keychain,比较少干iOS的活,不对的话欢迎指正。