一、接口安全实现方式
1.1数据加密
常见方式:对关键字段进行加密。例如,在登录的接口中对密码进行加密。加密算法有对称加密(如AES)、非对称加密(如RSA)或者哈希算法处理(如MD5)。
1.1.1 对称加密
对称加密:加密和解密都使用相同密钥的加密算法。
对称加密算法:
1、DES:密钥长度64位,其中有8位用于校验(第8、16、24、32、40、48、56、64位是校验位)。已经被破解,不再安全,基本没有企业再使用。加密速度快,适合大量数据,处理数据后可复原。
2、DESede(三重DES):早于AES出现代替DES。计算密钥时间太长,加密效率不高,所以基本上也不适用。
3、AES:最常用的对称加密算法。密钥建立时间短,灵敏性好,内存需求低。密钥长度128/192/256,其中192与256需要配置无政策限制权限文件。
4、IDEA:常用的电子邮箱算法,工作模式只有ECB,密钥长度有128位。
5、PBE:综合了消息摘要算法和对称加密算法,最常见的是PBEWithMD5AndDES。不安全,也不推荐使用。
1.2.1 非对称加密
非对称加密算法:需要有公钥和私钥两个密钥,它们是成对出现的。一般使用公钥进行加密,使用私钥进行解密。
非对称加密算法:
1、RSA:基于包含在大数分解中的复杂性,应用源于对两个大数乘积的巨大积分分量的因式分解。优点在于保密性较好,所有人都可以使用公钥进行加密,但只有持有私钥的人才能正确破解。使用两个较大的质数计算出的公钥和私钥,以目前的机器条件,几乎不可能在短时间内破译出来。缺点就是解密花费时间长、速度慢,只适合对少量数据进行加密。常用于保密性和认证性的场景,如数字签名。
2、DSA:安全性和RSA差不多,常用于数字签名算法。生成签名的速度快,验证速度很慢,加密时更慢,正好与RSA相反。现在有被破解的可能,不推荐使用。
3、ECC:基于椭圆曲线数学的公开密钥加密算法。现在超级计算机的运算能力在不断增强,像是DSA和RSA加密算法必须保证更长的密钥来保证安全性,这与需要更短的密钥来保证通信效率相互矛盾。ECC主要优势是可以使用更小的密钥并提供相当高等级的安全。ECC164位的密钥产生一个安全级,相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度更快,存储空间和传输带宽占用较少。目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,虚拟货币比特币也选择ECC作为加密算法。由于它是基于椭圆曲线的离散对数问题,曲线的选择很复杂。再加上是由美国国家安全局NSA指定标准(怕有后门)专利问题(申请人太多)的问题,很难推行。
4、DH:DH 算法其实也叫作 Diffie - Hellman 密钥交换协议,是一个不安全的秘钥共享网络协议,无法避免中间人攻击。
1.2数据加签验签
https加密数据并不是绝对安全的。https加密的部分只是在外网,然后有很多服务是内网相互跳转的,加签也可以在这里保证不被中间人篡改,所以一般转账类安全性要求高的接口开发,都需要加签验签。
加签:用Hash算法(如MD5,或者SHA-256)把原始请求参数生成报文摘要,然后用私钥对这个摘要进行加密,就得到报文对应的数字签名sign。通常请求方会把数字签名和报文原文一并发送给接收方。
验签:接收方拿到原始报文和数字签名(sign)后,用同一个Hash算法(比如都用MD5)从报文中生成摘要A。另外,用对方提供的公钥对数字签名进行解密,得到摘要B,对比A和B是否相同,就可以得知报文有没有被篡改过。
1.3 token授权认证机制
用户在登录成功后会获得一个token。用户每次请求都会带着token,只有token验证正确,才表明是合法请求。
可以采用RSA+DES+BASE64的方式对jwt进行加密。
1.4时间戳timestamp超时机制
用来防止恶意请求(比如DOS攻击),以搞垮你的系统。
用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后,解密,验签通过后,与服务器当前时间进行比对,如果时间差大于一定时间 (比如3分钟),则认为该请求无效。
1.5 timestamp+nonce方案防止重放攻击
防止在时间差内,黑客进行的重放攻击。
nonce指唯一的随机字符串,用来标识每个被签名的请求。我们可以将每次请求的nonce参数存储到一个“set集合”中,或者可以json格式存储到数据库或缓存中。每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。
1.6 限流机制
防止用户恶意频繁调用接口。
常用的限流算法有令牌桶和漏桶算法。可以使用Guava的RateLimiter单机版限流,也可以使用Redis分布式限流,还可以使用阿里开源组件sentinel限流。比如说,一分钟可以接受多少次请求。
1.7黑白名单机制
1.8数据参数脱敏、合法性校验
二、第三方登录
微信扫码登录:
使用了OAuth2.0,用户扫码确认后,微信开放平台会先给第三方应用一个临时票据(code)。第三方应用拿着这个code,再携带微信授权的appid和appserect返回给微信开放平台来换取access_token。
支付宝登录:
使用非对称加密的方式,由支付宝密钥生尘器或者Open SSL生成密钥。支付宝会用SHA256withRSA算法或者公钥证书进行接口调用时的验签。安全方式有加签验签(必填)、网关、IP白名单、接口内容加密等。
钉钉登录:
和微信类似。
三、OAuth2.0
是一种开放授权的机制。在资源所有者同意客户端访问资源时,会给客户端颁发令牌。客户端拿着这个令牌可以访问资源所有者的资源,无需资源所有者输入登录。
授权方式分为四种:授权码、隐藏式、密码式、客户端凭证。
简单来说就是,项目中有前后端的话使用授权式(使用code)和密码式(用账号密码去请求获取token),只有前端使用隐藏式(没办法发送code,直接获取token),只有后端用客户端凭证。扫码登陆用的就是授权码,账号密码登录用的是密码式。