首页 > 解决方案 > 在 Kotlin 中生成 HMAC-SHA1 签名

问题描述

我正在尝试使用他们的 API 从数据库中获取产品。

文档内容如下:

The "signature" is an encrypted version of the UPC or EAN code that is SHA-1 hashed with your authorization key

我曾尝试在 Kotlin 中执行此操作,并且正在返回“无效签名”。

object HmacSha1Signature {
    private val HMAC_SHA1_ALGORITHM = "HmacSHA1"

    private fun toHexString(bytes: ByteArray): String {
        val formatter = Formatter()

        for (b in bytes) {
            formatter.format("%02x", b)
        }

        return formatter.toString()
    }

    @Throws(SignatureException::class, NoSuchAlgorithmException::class, InvalidKeyException::class)
    fun calculateRFC2104HMAC(data: String, key: String): String {
        val encoder = Base64.getEncoder()
        // get an hmac_sha1 key from the raw key bytes
        val signingKey = SecretKeySpec(key.toByteArray(), "HmacSHA1")
        // get an hmac_sha1 Mac instance and initialize with the signing key
        val mac = Mac.getInstance("HmacSHA1")
        mac.init(signingKey)
        // compute the hmac on input data bytes
        val rawHmac = mac.doFinal(data.toByteArray())
        return encoder.encodeToString(rawHmac)
    }
}

URL 的格式是正确的,因为它表示签名无效。

我相信它需要 64 位编码。因为他们提供了其他语言的示例,似乎是除 Java 之外的所有示例 :(

C#

private string GetDigitEyesVerificationCode(string UpcCode) {
    var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(AuthKey));
    var m = hmac.ComputeHash(Encoding.UTF8.GetBytes(UpcCode));
    return Convert.ToBase64String(m);
}

标签: androidkotlinsha

解决方案


推荐阅读