Appearance
后端接入
后端接入通常用来验证签名是否合法,通过前端接入最终会得到一个 token
如果想验证真伪这需要后端来做。
前言
在接入之前你需要获取个人密钥,此密钥用于验证签名。
获取个人密钥:立刻享用小程序 - 我的 - 个人信息 - 个人密钥 - 复制
验证签名
签名算法采用 HMAC-SHA-256
它可以在不暴露密钥的情况下验证数据是否合法。
通过 前端接入
最终我们可以得到 timestamp
、ticket
、state
、token
、resourceId
五个变量。
例如:
text
// 这个是个人密钥(绝对不要泄漏)
secret=28d78ccfb25622b4d703c71b
// 通过 ticket 得到的 token
token=615051c4b81795efa5a406e4172df5835ea1f6b8387ef518cec3b8b2af2e578c
timestamp=1716622123
ticket=1FP4e7LIaI
state=
resourceId=2
拼接在一起得到:
str = resourceId=2&state=&ticket=1FP4e7LIaI×tamp=1716622123
hex=HMAC_SHA_256(secret).hex(str)
正确情况下 hex 的值是: 615051c4b81795efa5a406e4172df5835ea1f6b8387ef518cec3b8b2af2e578c
hex 与 token 一致时说明用户真的获取成功了,如果一致说明数据被篡改,用户没有真正的获取资源。
语言实现
Java
pom.xml
xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
java
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
public class HmacUtilsTest {
public static void main(String[] args) {
final String secret = "28d78ccfb25622b4d703c71b";
final String timestamp = "1716622123";
final String ticket = "1FP4e7LIaI";
final String state = "";
final String resourceId = "2";
final String hex = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secret)
.hmacHex(String.format("resourceId=%s&state=%s&ticket=%s×tamp=%s", resourceId, state, ticket, timestamp));
System.out.println(hex);
}
}
Golang
go
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)
func main() {
secret := "28d78ccfb25622b4d703c71b"
timestamp := "1716622123"
ticket := "1FP4e7LIaI"
state := ""
resourceId := "2"
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte("resourceId=" + resourceId + "&state=" + state + "&ticket=" + ticket + "×tamp=" + timestamp))
println(hex.EncodeToString(h.Sum(nil)))
}