您现在的位置是:数据库 >>正文
研发必备:轻松玩转开放接口API签名和验签
数据库711人已围观
简介一、简介开放接口API的签名和验签是一种常见的安全机制,用于确保接口请求的完整性和真实性。1.1、对称加密和非对称加密对称加密:加密和解密使用的是同一把密钥。常用的对称加密算法:DES,AES,3DE ...
一、研发验签简介
开放接口API的必备签名和验签是一种常见的安全机制 ,用于确保接口请求的轻松I签完整性和真实性 。
1.1、玩转对称加密和非对称加密
对称加密:加密和解密使用的开放是同一把密钥。常用的接口对称加密算法 :DES ,AES,名和3DES。研发验签
非对称加密:加密和解密使用的必备是源码库不同的密钥,一把作为公开分享给加密方的轻松I签叫做公钥,另一把不分享作为解密的玩转私钥 。公钥加密的开放密文只有私钥能进行解密;私钥加密的密文也只有公钥能进行解密。常见的接口非对称加密算法:RSA,ECC。名和
总之:在效率上来说 ,研发验签对称加密的效率显然更高 ,但是服务器租用非对称加密的安全性更高。所以一般在实际的HTTPS加密过程中 ,首次连接使用的是公钥加密算法(非对称加密)来传输数据加密所要使用的对称加密的密钥,之后传输中使用的都是对称加密算法 。
1.2、生成非对称秘钥对
第三方系统作为调用方(客户端),与接口服务方(服务端)约定好加密算法和客户端名称(clientID),便于在服务方系统中来唯一标识调用方系统 。约定好以后 ,源码下载服务方为每一个调用方系统专门生成一个专属的非对称密钥对(RSA密钥对)。私钥颁发给调用方系统(客户端),公钥由服务方持有 。
图片
注意:调用方(客户端)系统需要保管好私钥(存到调用方系统的后端)。因为对于服务方系统而言 ,调用方系统是消息的发送方,其持有的私钥唯一标识了它的身份是服务方系统受信任的调用方。调用方系统的建站模板私钥一旦泄露,调用方对原系统毫无信任可言 。
1.3 开放接口API
不需要登录凭证就允许被第三方系统调用的接口,必须要考虑接口数据的安全性问题。比如 :数据是否被篡改?数据是否已过时?数据是否可以重复提交 ?等问题。为了防止开放接口被恶意调用,开放接口一般都需要验签才能被调用。
1.4 、 签名和验签
签名:是第三方系统在调用接口API前 ,需按照接口API提供方的云计算规则根据所有请求参数生成一个签名(字符串) ,在调用接口时携带该签名的。
特别注意 :为了确保生成签名的处理细节与服务方系统的验签逻辑是匹配的 ,服务方系统一般都提供jar包或者代码片段给调用方来生成签名 ,否则可能会因为一些处理细节不一致导致生成的签名是无效的
验签:接口提供方会验证签名的有效性 ,只有签名验证有效才能正常调用接口,否则请求会被驳回 。香港云服务器
图片
二 、应用案例
图片
核心代码 :
复制/** * @Description: TODO:使用RSA完成签名验签 * @Author: yyalin * @CreateDate: 2023/3/28 14:37 * @Version: V1.0 */ @Slf4j public class RSAUtils { public static final String SIGNATURE_INSTANCE = "SHA256withRSA"; //签名 public static final String KEYPAIR_INSTANCE = "RSA"; //秘钥类型 /** * 功能描述:RSA公私钥生成器 * @MethodName: genKey * @MethodParam: [] * @Return: Map * @Author: yyalin * @CreateDate: 2023/12/18 15:34 */ public static Map genKey() throws Exception{ KeyPairGenerator kpg = KeyPairGenerator.getInstance(KEYPAIR_INSTANCE); kpg.initialize(1024); KeyPair kep = kpg.generateKeyPair(); PrivateKey pkey = kep.getPrivate(); PublicKey pubkey = kep.getPublic(); Map<String,Object> param=new HashMap<String,Object>(); param.put("publicKey", new String(Base64Utils.encode(pubkey.getEncoded()))); param.put("privateKey", new String(Base64Utils.encode(pkey.getEncoded()))); return param; } /** * 功能描述:RSA签名 * @MethodName: sign * @MethodParam: [content:需要签名的字符串, privateKey:RSA私钥] * @Return: java.lang.String * @Author: yyalin * @CreateDate: 2023/12/18 16:10 */ public static String sign(String content, String privateKey) throws Exception { byte[] str= Base64Utils.decode(privateKey.getBytes("UTF-8")); PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(str); KeyFactory keyf = KeyFactory.getInstance(KEYPAIR_INSTANCE); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature.getInstance(SIGNATURE_INSTANCE); signature.initSign(priKey); signature.update(content.getBytes("UTF-8")); byte[] signed = signature.sign(); return new String(Base64Utils.encode(signed),"UTF-8"); } /** * 功能描述:RSA验签 * @MethodName: verify * @MethodParam: [content:原文内容, sign:待验证的签名, public_key:RSA公钥] * @Return: boolean 签名结果 * @Author: yyalin * @CreateDate: 2023/12/18 16:11 */ public static boolean verify(String content, String sign, String public_key) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance(KEYPAIR_INSTANCE); byte[] encodedKey = Base64Utils.decode(public_key.getBytes("UTF-8")); PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); java.security.Signature signature = java.security.Signature.getInstance(SIGNATURE_INSTANCE); signature.initVerify(pubKey); signature.update(content.getBytes("UTF-8")); boolean bverify = signature.verify(Base64Utils.decode(sign.getBytes("UTF-8"))); return bverify; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.测试内容:
复制//测试使用 public static void main(String[] args) throws Exception { //1、获取公私钥匙 请求方获取公钥私钥后,传私钥发送请求 Map<String,Object> param=RSAUtils.genKey(); log.info("输出的公钥私钥param:"+param); String publicKey= (String) param.get("publicKey"); String privateKey= (String) param.get("privateKey"); //2、签名 获取私钥 ,获取请求后对内容进行加标签返回 String cnotallow="您好!"; String sign=RSAUtils.sign(content, privateKey); log.info("使用私钥输出的标签sign:"+sign); //3、验签 // String cnotallow="您好!"; boolean verify=RSAUtils.verify(content, sign, publicKey); log.info("使用公钥验签结果verify :"+verify); }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.测试结果:
图片
请求体内容被篡改了:
图片
Tags:
转载:欢迎各位朋友分享到网络,但转载请说明文章出处“算法与编程”。http://www.bzli.cn/news/951e499044.html
相关文章
企业如何开始升级安全意识工作
数据库10月是安全意识月,这是一个令人兴奋的时刻,因为世界各地的企业都在培训人们如何在工作和家庭中保持网络安全。但是,安全意识到底是什么?更重要的是,我们为什么要关心它?根据企业的不同,安全意识有许多其他 ...
【数据库】
阅读更多安装win10系统卡住不动了怎么办
数据库我们在对win10系统进行更新或者安装的时候,有时候可能会遇见进度卡在一半停在那里突然不动了的情况。对于这种情况小编认为可能是后台的网络原因导致更新无法顺利进行,只要等网络恢复即可。或者是我们在更新、 ...
【数据库】
阅读更多做设计win7还是win10强
数据库如果有些小伙伴是做设计方面的,那么对于win10和win7之间该怎么选择呢?小编觉得,win10相对来说运行软件更加流畅,打开速度也比win7快一些。而win7虽然兼容性好,但是其运算速度远没有win ...
【数据库】
阅读更多
热门文章
最新文章
友情链接
- Realtek 蓝牙安全连接配对漏洞可导致攻击者发起拒绝服务攻击
- 神舟战神K540D-i7D2笔记本电脑的性能和用户体验(一款高性能笔记本电脑的推荐及评测)
- 戴尔易安信加固过的机箱,保证在远程和恶劣环境下工作的可靠性,满足边缘工作负载不断增长的需求
- 0day 漏洞量产?AI Agent “生产线”曝光
- 新型 PumaBot 僵尸网络瞄准 Linux 物联网设备窃取 SSH 凭证并挖矿
- Windows WebDAV 零日远程代码执行漏洞遭野外利用
- W7手动还原系统教程(一步步教您如何使用W7手动还原系统,保护和修复您的计算机)
- 戴尔笔记本F2刷机教程(戴尔笔记本F2刷机方法详解,助你发挥最大潜力)
- 苹果6s升级iOS11的体验(以苹果6s为例,探索iOS11的新特性和性能提升)
- 你的App每三分钟就会遭遇一次攻击 b2b信息平台源码库云服务器网站建设企业服务器亿华云香港物理机