囧次元[1.5.7.9]版本-签名与加密算法解析


本文将深入分析开源项目Go-Jocy中调用外部API时使用的签名验证机制和加密算法,通过通俗易懂的方式讲解其设计思路和实现原理。

项目背景

Go-Jocy是一个基于Go语言和Gin框架开发的高性能二次元视频聚合后端服务。在调用外部视频解析API时,项目实现了一套复杂的签名验证和数据加密机制,确保与第三方服务的安全通信。

外部API签名算法概览

Go-Jocy项目在调用外部API时主要使用了以下几种签名和加密技术:

  1. MD5双签名机制 - 针对视频播放URL的专用签名
  2. RSA+AES混合加密 - 保护请求数据的安全传输
  3. Lua脚本动态解析 - 灵活处理不同API的签名要求
  4. 时间戳防重放 - 确保请求的时效性

核心签名算法分析

1. 视频播放URL的双签名机制

项目为视频播放URL实现了专门的双签名验证机制:

func MD5PlayUrlSign(jmStr, salt, ts string) string {
    combined := jmStr + salt + ts
    hash := md5.Sum([]byte(combined))
    return hex.EncodeToString(hash[:])
}

签名生成过程:

  1. 将输入字符串、固定盐值和时间戳拼接
  2. 对拼接后的字符串进行MD5哈希运算
  3. 将哈希结果转换为十六进制字符串

2. 双重签名验证策略

在请求外部视频解析API时,系统会生成两个不同的签名:

// 基于应用版本的签名
client.SetHeaderVerbatim("x-sign1", MD5PlayUrlSign(appVersion, salt, ts))

// 基于视频源地址的签名  
client.SetHeaderVerbatim("x-sign2", MD5PlayUrlSign(source, salt, ts))

双签名的作用:

  • x-sign1:验证客户端应用的合法性
  • x-sign2:验证请求视频源的完整性
  • 时间戳:防止重放攻击
  • 固定盐值:"v50gjcy"作为签名密钥

RSA+AES混合加密机制

1. 请求数据加密流程

项目实现了RSA和AES结合的混合加密方案:

func EncryptRequests(data string) (string, error) {
    // 1. 生成16位随机密钥
    rsaKey := RandomString(16)
    
    // 2. 反转密钥作为IV向量
    rsaIV := ReverseString(rsaKey)
    
    // 3. RSA加密AES密钥
    encryptedRSA, err := RsaEncryption(rsaKey)
    
    // 4. AES加密实际数据
    encryptedAES, err := AesEncryption(data, rsaKey, rsaIV)
    
    // 5. 组合加密结果
    return fmt.Sprintf("%s.%s", encryptedRSA, encryptedAES), nil
}

加密步骤详解:

  1. 密钥生成:随机生成16位AES密钥
  2. IV生成:将AES密钥反转作为初始化向量
  3. RSA加密:使用公钥加密AES密钥
  4. AES加密:使用AES-CBC模式加密实际数据
  5. 结果组合:用点号分隔RSA和AES加密结果

Lua脚本动态解析机制

1. 灵活的脚本执行环境

项目支持通过Lua脚本动态处理不同API的签名要求:

func DecryptPlayUrlLUA(luaScript, source, AuthIP string) (any, error) {
    // 创建Lua执行环境
    L := lua.NewState()
    defer L.Close()
    
    // 注册工具函数
    L.SetField(L.GetGlobal("utils"), "md5", L.NewFunction(func(L *lua.LState) int {
        input := L.ToString(1)
        result := MD5Encryption(input)
        L.Push(lua.LString(result))
        return 1
    }))
}

2. 内置工具函数

Lua环境提供了丰富的工具函数:

  • utils.md5():MD5哈希计算
  • utils.timestamp():获取当前时间戳
  • utils.aes128cbc_decrypt():AES解密
  • httpGet():HTTP请求发送

开源地址

后端项目地址:https://github.com/nuanxinqing123/go-jocy

前端项目地址:https://github.com/nuanxinqing123/jocy-web-refactoring

 

阅读剩余
THE END