对外开放接口的Appkey和Secret应该如何设置?

文章目录

    • appkey和Secret 分别是什么?
      • App key
      • app secret
    • Appkey和Secret 因遵循什么原则?
    • 代码示例
      • 随机生成有效的appkey
      • 校验Appkey
      • 调用效果
    • 小结

appkey和Secret 分别是什么?

App key

App key简称API接口验证序号,是用于验证API接入合法性的。接入哪个网站的API接口,就需要这个网站允许才能够接入,如果简单比喻的话:可以理解成是登陆网站的用户名。

app secret

App secret:的意思为“私匙”,简称api接口密钥,是跟app key配套使用的,可以简单理解成是密码,它是微信公众平台服务号才有的。

Appkey和Secret 因遵循什么原则?

Appkey 随机生成,Secret固定,其中Appkey的生成最好是采用无规则的方式生成。例如:
123456 MD5加密后就生成了32位或者64位的字符串,再将其拆分为若干段,例如拆分成三段,每段有多少个,然后生成一个2000随机乱码字符串中,将secret 插入到2000个字符串中的固定位置,然后检查乱码字符串长度是否附后,然后substring拆你要的加密字符串,然后解密出来看是否能得到原来的明文。

代码示例

随机生成有效的appkey

这里我采用的是 sha256 加密算法。将secret加密后在生成长度为两千的随机字符串,再根据secret的长度进入混合插入。生成可校验的appkey。这里为了方便读者理解所以设计的相对简单明了,实际开发中混合不会是这样有规律的。

 /// <summary>
 /// 生成Appkey
 /// </summary>
 /// <param name="secret"></param>
 /// <returns>随机生成的有效key</returns>
 static string CreateAppkey(string secret)
 {
     if(!string.IsNullOrWhiteSpace(secret))
     {
         string sha256 = ComputeSHA256Hash(secret);
         string salt = Salt(2000);
         StringBuilder stringBuilder = new StringBuilder();
         //混淆算法
         for (int i = 0; i < secret.Length; i++)
         {
             stringBuilder.Append(salt[i]); 
             stringBuilder.Append(sha256[i]);
         }
        string str=stringBuilder.ToString().Substring(0, secret.Length);
         return str;
     }
     else
     {
         return secret;
     }
     
 }
  /// <summary>
  /// sha256加密算法
  /// </summary>
  /// <param name="input">需要加密的字符串</param>
  /// <returns>加密后的字符串</returns>
  static string ComputeSHA256Hash(string input)
  {

      StringBuilder builder = new StringBuilder();
      using (var sha256 = SHA256.Create())
      {
          byte[] textData = Encoding.UTF8.GetBytes(input); // 将字符串编码为字节数组

          byte[] bytes= sha256.ComputeHash(textData); // 返回 SHA-256 哈希值的字节数组
          for (int i = 0; i < bytes.Length; i++)
          {
              builder.Append(bytes[i].ToString("x2"));
          }
          return builder.ToString();
      }
  }

/// <summary>
/// 生成盐
/// </summary>
/// <param name="length">需要生成的盐的长度</param>
/// <returns>所需长度的盐</returns>
static string Salt(int length)
{
    StringBuilder stringBuilder = new StringBuilder();
    Random random=new Random();
    for (int i = 0; i < length; i++)
    {
       byte[] bytes= System.Text.Encoding.Default.GetBytes(KEY_CHARS[random.Next(KEY_CHARS.Length)].ToString());
        stringBuilder.Append(Encoding.Latin1.GetString(bytes));
    }

    return stringBuilder.ToString();
}

校验Appkey

校验时需要将secret 和appkey同时传入,传入后我们按照加密时对secret的操作再操作一遍,然后按照之前的混淆方式去除我们用来校验的加密部分也就是代码中的名为[aa]的字符串,再取出appkey中用来校验的部分也就是代码中名为【bb】的字节数组。再将其转换为字符串,与aa做比较。

    /// <summary>
    /// 验签
    /// </summary>
    /// <param name="key">用户的appkey</param>
    /// <returns>是否验签通过</returns>
    static bool Sign(string secret, string key)
    {
        bool state = false;
        if(!string.IsNullOrWhiteSpace(key)&&!string.IsNullOrWhiteSpace(secret))
        {
            string sha256 = ComputeSHA256Hash(secret);
            string aa=sha256.Substring(0, secret.Length/2);
            StringBuilder stringBuilder = new StringBuilder();
            IEnumerable<char> bb = key?.ToList().Where((value, index) => index % 2 != 0)??new List<char>();
            string bstr= String.Concat(bb);
            if (aa== bstr)
            {
                state=true;
            }
           
        }
        return state;
    }

调用效果

   static void Main()
  {
      try
      {
          for (int i = 0; i < 5; i++)
          {
              string secret=Guid.NewGuid().ToString("N");
              string key = CreateAppkey(secret);
              Console.WriteLine("AppKey:{0}---Secret:{1}", key, secret);
              bool isok = Sign(secret, key);
              Console.WriteLine("验签:{0}", isok);
          }
      }
      catch (Exception ex)
      {

          Console.WriteLine(ex.Message);
      }
     
      Console.ReadLine();
  }

在这里插入图片描述

小结

在对外开放接口的设计中应该要考虑到接口的安全性和可扩展性。以上这种方式我们只需要保存相关的secret就可以完成校验了,不需要将key保存到数据库中。当我们需要生成一个appkey时直接将secret传入生成方法即可。与固定appkey和secret比起来更为方便,也更为安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ - 类和对象(上)

目录 一、类的定义 二、访问限定符 public&#xff08;公有&#xff09; protected&#xff08;保护&#xff09; private&#xff08;私有&#xff09; 三、类声明和定义分离 四、外部变量和成员变量的区别与注意 五、类的实例化 六、类对象的模型 七、类的this指针…

linux系统编程 socket part2

报式套接字 1.动态报式套接字2.报式套接字的广播3.报式套接字的多播4.UDP协议分析4.1.丢包原因4.2.停等式流量控制 接linux系统编程 socket part1 1.动态报式套接字 在之前的例子上&#xff0c;发送的结构体中的名字由定长改变长。可以用变长结构体。 变长结构体是由gcc扩展的…

主流电商平台淘宝/1688/京东电商数据实时采集监测|电商API接口接入

电商大数据平台基于网络主流电商平台淘宝/1688/京东电商数据进行搭建&#xff0c;全面监测了包含淘宝、京东、苏宁、美团、大众点评等共计100余个主流电商交易平台&#xff0c;并凭借多年的电子商务数据分析挖掘经验积累形成的电商数据清洗体系和挖掘模型&#xff0c;能高效完成…

ARIMA

一.数据平稳性与差分法 1.平稳性&#xff1a; 2.差分法&#xff1a; 错开时间点&#xff0c;使得数据可以平稳 原数据➡️一阶差分➡️二阶差分&#xff1a; 二、arima 1.自回归模型 2.移动平均模型 关注的是误差项的累积 3.arma p d(几阶差分&#xff09; q自己指定 4.总…

分手我见得多了,怎么软件也玩分手?

网管小贾 / sysadm.cc 今年年初&#xff0c;我们就注意到了一件忒奇怪的事儿。 我们公司的同事小孙&#xff0c;以前人长得高高瘦瘦&#xff0c;做人做事也是谨小慎微、内敛腼腆&#xff0c;怎么突然间变得容光焕发、大大咧咧&#xff0c;脸上肚子上也多了几斤肉&#xff0c;整…

基于ssm的酒店民宿管理系统的设计与实现

系统主要功能介绍&#xff1a; 1、登录&#xff1a;输入账号密码进行登录&#xff0c;登录后才能进行相应的操作 2、客房管理&#xff1a;客房管理主要是酒店预订&#xff0c;可以选择不同的房间&#xff0c;比如大床房&#xff0c;家庭房等&#xff0c;入住办理&#xff0c;…

【力扣刷题日记】1076.项目员工II

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1076.项目员工II 表&#xff1a;Project 列名类型project_idintemployee_idint (project_id, employee_id)…

AIGC实战——Transformer模型

AIGC实战——Transformer模型 0. 前言1. T52. GPT-3 和 GPT-43. ChatGPT小结系列链接 0. 前言 我们在 GPT (Generative Pre-trained Transformer) 一节所构建的 GPT 模型是一个解码器 Transformer&#xff0c;它逐字符地生成文本字符串&#xff0c;并使用因果掩码只关注输入字…

代码随想录算法训练营第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 刷题https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/文章讲解https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html视频讲解https://www…

Arduino中的map函数

一、案例 val analogRead(dyPin); //读取模拟口的模拟量数值 dyValuemap(val,0,1023,0,500);//这个函数是将电位器调节的模拟量的值按比例转换成对应的电压量 问题&#xff0c;为什么不是0~499呢&#xff1f; 其实也行↓ 当map(val, 0, 1023, 0, 500)被调用时&#xff0…

YiYi-Web项目介绍

YiYi-Web项目介绍 1. 简介2. 使用2.1 后端开发环境2.2 前端开发环境 3. 测试环境&#xff1a;4. 更新日志5. 打包情况6.项目截图 本项目前端是html、css、js、jQuery基础技术。 后端都是最新的SpringBoot技术&#xff0c;不分离版本&#xff0c; 是最基础的项目开发教程&#x…

yolov5训练并生成rknn模型部署在RK3588开发板上,实现NPU加速推理

简介 RK3588是瑞芯微&#xff08;Rockchip&#xff09;公司推出的一款高性能、低功耗的集成电路芯片。它采用了先进的28纳米工艺技术&#xff0c;并配备了八核心的ARM Cortex-A76和Cortex-A55处理器&#xff0c;以及ARM Mali-G76 GPU。该芯片支持多种接口和功能&#xff0c;适…

atoi函数详解

atoi函数使用方法 在c官网中是这样介绍atoi函数的 通俗的讲就是把字符串中的字符数字转换为整形数字&#xff0c;遇到空格就跳过&#xff0c;如果在字符串开始遇到不是有效的整数比如说abc就直接返回0&#xff0c;如果遇到像这种情况123abc345这个就只返回123&#xff0c;这个…

申请Github Education获取免费Copilot权限(2024.3.18实测成功)

起因&#xff1a;旧帐户Copilot权限被封 我已经离开Github Copilot就无法独自耐着性子写代码了&#xff08;懒惰AI成瘾性&#xff09;&#xff0c;这两天Github Copilot不知道为什么在大规模封号&#xff0c;我不幸也被封号了&#xff08;禁用掉了Github Copilot权限&#xff…

大数据技术原理与应用 01.大数据概述

不可以垂头丧气&#xff0c;会显矮 —— 24.3.24 参考学习&#xff1a;厦门大学 林子雨老师 大数据技术原理与应用 一、大数据时代 大数据概念、影响、应用、关键技术 大数据与云计算、物联网的关系 ①三次信息化浪潮时代 ②第三次信息化浪潮的技术支撑 1>存储设备容量不断…

微服务(基础篇-003-Nacos)

目录 Nacos注册中心&#xff08;1&#xff09; 认识和安装Nacos&#xff08;1.1&#xff09; Nacos快速入门&#xff08;1.2&#xff09; 服务注册到Nacos(1.2.1) Nacos服务分级存储模型&#xff08;1.3&#xff09; 配置集群&#xff08;1.3.1&#xff09; 根据集群修改…

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee&#xff0c;创建你的远程仓库&#xff0c;根据提示初始化本地仓库&#xff08;这里以我的仓库为例&#xff09; 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增&#xff08;变…

阿里云倚天云服务器怎么样?如何收费?

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

AI预测福彩3D第17弹【2024年3月24日预测--第1套算法重新开始计算第14次测试】

今天周末&#xff0c;家里事情比较多&#xff0c;回来的比较晚&#xff0c;3D预测的结果只能在今天晚上7点半左右发布了。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月24日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a…

大宇、德国ODI、希亦超声波清洗机值得买吗?精品轻松分辨

长时间佩戴眼镜不清洗的话上面的细菌堪比马桶这么脏&#xff01;从佩戴眼镜开始就没有人告诉过我手动清洗眼镜会非常容易刮花镜片&#xff0c;是我自己佩戴眼镜这么长时间观察到的&#xff0c;后面了解到超声波清洗机可以很好的保护到眼镜&#xff0c;于是开始做功课挑选超声波…