令牌、网关、验证码等"/>
如何保证接口的安全性, 对称加密、非对称加密、验证签名(md5)、令牌、网关、验证码等
接口数据加密
1. 对我们的接口实现对称加密,抓包的时候看不到明文的数据,但是可以被破解,因为客户端与服务器都是采用同一个密钥实现加解密,可以通过反编译客户端代码得出密钥实现破解,对称加密 Des、Aes
2. 使用非对称加密RSA公钥和私钥互换机制,客户端使用公钥实现加密,服务器端采用私钥实现解密,就算黑客破解出公钥也无法对数据实现解密。
rsa非对称加密:就是一对密钥对(由私钥和公钥组成)。 是目前公认最安全的加密算。
rsa非对称加密原理:使用公钥对数据加密,必须要用私钥进行解密(密钥对的私钥)。
- 对称加解密速度比RSA非对称加密要快,但是不安全。
非对称加密可实现:公钥加密、私钥解密; 私钥加密、公钥解密(公钥加密公钥是无法解密的)
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import java.util.Base64;public class RSAEncryptionDecryptionExample {public static void main(String[] args) throws Exception {// 在线生成公钥、私钥://// 公钥加密 ///// 给定的公钥字符串和明文字符串String publicKeyString = "公钥字符串";String plaintext = "待加密的明文";// 将公钥转换为字节数组形式byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString);// 使用公钥进行加密得到密文PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encrypted = cipher.doFinal(plaintext.getBytes());String encryptedString = Base64.getEncoder().encodeToString(encrypted);System.out.println("加密后的密文: " + encryptedString);/// 私钥解密 ///// 给定的私钥字符串和密文字符串String privateKeyString = "私钥字符串";String encryptedText = "待解密的密文";// 将私钥和密文转换为字节数组形式byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);// 使用私钥进行解密得到明文PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);String decryptedText = new String(decryptedBytes, "UTF-8");System.out.println("解密后的明文: " + decryptedText);}
}
验证签名(验签):
url传递的数据还是明文的,只不过服务端会做md5校验,通过md5的值去比对传递的参数,是否发生变化。
例如:
1. 商品在以from表单提交参数给支付宝对参数 Money=1000&orderNumber=10000 生成一个md5值 sign=YP8CFwTwTcEIdfcxZ1NmMZ%2FiV5%2BSw8Ihn8sorz6lVdENKbQDf5I
1.1. 最终传递的url:=1000&orderNumber=10000&sign=YP8CFwTwTcEIdfcxZ1NmMZ%2FiV5%2BSw8Ihn8sorz6lVdENKbQDf5I
2. 支付宝服务器端接收参数
Money=1000&orderNumber=10000&sign=YP8CFwTwTcEIdfcxZ1NmMZ%2FiV5%2BSw8Ihn8sorz6lVdENKbQDf5I
将明文的Money和orderNumber数据做一个md5值,然后和sign签名查看是否相同(md5值相同表示为篡改)。
使用MD5
可以采用MD5对我们的参数实现验证签名(参考以上demo),但是数据还是传输明文,可以防止篡改数据。
使用令牌
在rpc传递参数过程中使用令牌隐藏真实的参数。 例如:登录成功把用户信息生成token存入redis,把key响应给客户端。
HTTPS
1. 互联网电商项目都会采用Https协议 ssl+证书 加密传输 默认443 而我们的Http协议采用明文实现对数据传输,效率比较Https要高,但是不安全。
网关
使用api网关过滤器对防止xss、sql注入问题
<script>alert(‘ss’)</script>
黑白名单
- 对我们的api接口实现黑名单和白名单控制
Money=1899&orderId=123456
服务保护相关
对我们接口实现服务保护、限流、熔断
验证码
使用图形验证码防止机器模拟请求
更多推荐
如何保证接口的安全性, 对称加密、非对称加密、验证签名(md5)、令牌、网关、验证码等
发布评论