appid、appkey和appsecret

什么是appid、appkey、appsecret

  1. appid(应用编号/应用唯一标识)

    • appid 是应用的唯一标识符,用于标识和区分不同的客户端或应用。
    • 当开发者在第三方平台上注册应用时,平台会生成一个唯一的 appid
    • 在API请求中,appid 通常作为请求参数之一,用于表明请求的发起者身份。
    • 第三方平台可以使用 appid 来识别和管理不同的应用。
  2. appkey(应用密钥/API接口验证序号)

    • appkey 类似于用户名或账号,用于验证API接入的合法性。
    • 开发者在注册应用时,第三方平台会生成一个或多个 appkey,并与 appid 关联。
    • 不同的 appkey 可以有不同的权限配置,例如只读、读写等。
    • 在API请求中,开发者需要将 appkey 作为请求参数或请求头的一部分,与 appid 一起发送。
    • 第三方平台会根据 appid 和 appkey 来验证请求的合法性,并授权相应的操作。
  3. appsecret(应用私密/私匙/API接口密钥)

    • appsecret 是与 appkey 配套使用的密码或密钥。
    • 它用于加密和解密数据,确保API请求的安全性。
    • 开发者在注册应用时,第三方平台会生成一个 appsecret,并与 appid 和 appkey 关联。
    • 在实际使用中,appsecret 不会被直接发送到客户端,而是由开发者在服务器端保存和使用。
    • 当需要验证API请求的合法性时,开发者会使用 appsecret 对请求进行签名或加密处理,并将签名或加密结果发送到第三方平台。
    • 第三方平台会使用相同的 appsecret 对接收到的签名或加密结果进行验证,以确认请求的合法性。

使用方法

  1. 向第三方服务器请求授权时,带上AppKey和AppSecret(需存在服务器端)

  2. 第三方服务器验证AppKey和AppSecret在DB中有无记录

  3. 如果有,生成一串唯一的字符串(token令牌),返回给服务器,服务器再返回给客户端

  4. 客户端下次请求敏感数据时带上令牌

API接口开发安全性

[推荐]API接口安全性设计
参考URL: https://www.jianshu.com/p/c6518a8f4040

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

  1. Token授权机制
    用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证。

  2. 时间戳超时机制
    用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。

  3. 签名机制
    将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。

  4. 拒绝重复调用(非必须)
    客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)。

签名

md5(app_secret + timestamp + appid)

Reference

API接口开发安全性,你是如何解决的
https://www.sohu.com/a/281386848_652662
[推荐]API接口安全性设计
https://www.jianshu.com/p/c6518a8f4040

开放api接口平台:appid、appkey、appsecret_西京刀客-GitCode 开源社区

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮您编写一个使用SM国密生成appkeyappsecret的Java代码。以下是示例代码: ``` import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class SMAppKeyGenerator { private static final String ALGORITHM = "SM3withSM2"; private static final String KEY_ALGORITHM = "EC"; private static final String PROVIDER = "GM"; public static void main(String[] args) throws Exception { String appId = "your_app_id"; String appSecret = generateAppSecret(); String appKey = generateAppKey(appId, appSecret); System.out.println("AppId: " + appId); System.out.println("AppSecret: " + appSecret); System.out.println("AppKey: " + appKey); } private static String generateAppSecret() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM, PROVIDER); keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); byte[] encodedPrivateKey = privateKey.getEncoded(); return bytesToHexString(encodedPrivateKey); } private static String generateAppKey(String appId, String appSecret) throws Exception { byte[] appIdBytes = appId.getBytes("UTF-8"); byte[] appSecretBytes = hexStringToBytes(appSecret); byte[] data = new byte[appIdBytes.length + appSecretBytes.length]; System.arraycopy(appIdBytes, 0, data, 0, appIdBytes.length); System.arraycopy(appSecretBytes, 0, data, appIdBytes.length, appSecretBytes.length); MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM, PROVIDER); byte[] digest = messageDigest.digest(data); return bytesToHexString(digest); } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); } private static byte[] hexStringToBytes(String hexString) { int len = hexString.length() / 2; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = (byte) Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16); } return bytes; } } ``` 这段代码使用了SM2算法生成了一个公私钥对,然后使用SM3withSM2算法对AppIdAppSecret进行哈希计算,得到AppKey。请注意,这里使用了Bouncy Castle作为Java加密库的提供者,因为它支持SM算法。如果您的Java环境中没有安装Bouncy Castle,您需要先下载并安装它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值