如何将php函数转换为kotlin android?
我有一个项目正在进行中,它使用一个API进行it请求,但是为了实现它们,我需要首先生成令牌 在API更新之前,一切都正常工作,更新之后,我不知道如何调整代码使其再次工作 这是在更新(Android | Kotlin)之前运行的代码:如何将php函数转换为kotlin android?,php,android,kotlin,Php,Android,Kotlin,我有一个项目正在进行中,它使用一个API进行it请求,但是为了实现它们,我需要首先生成令牌 在API更新之前,一切都正常工作,更新之后,我不知道如何调整代码使其再次工作 这是在更新(Android | Kotlin)之前运行的代码: fun hmacHash(str: String, secret: String): String { val sha256HMAC = Mac.getInstance("HmacSHA256") val secretKey = SecretKey
fun hmacHash(str: String, secret: String): String {
val sha256HMAC = Mac.getInstance("HmacSHA256")
val secretKey = SecretKeySpec(secret.toByteArray(), "HmacSHA256")
sha256HMAC.init(secretKey)
return convertToHex(sha256HMAC.doFinal(str.toByteArray()))
}
fun convertToHex(data: ByteArray): String {
val buf = StringBuilder()
for (b in data) {
var halfbyte = (b.toInt() shr 4) and (0x0F.toByte()).toInt()
var two_halfs = 0
do {
buf.append(if (halfbyte in 0..9) ('0'.toInt() + halfbyte).toChar() else ('a'.toInt() + (halfbyte - 10)).toChar())
halfbyte = (b and 0x0F).toInt()
} while (two_halfs++ < 1)
}
return buf.toString()
}
hash_hmac('sha256', $string, $privateKey);
但在更新之后,php代码如下所示:
hash_hmac('sha256', $string, hex2bin($privateKey));
我不知道如何调整我的代码,使之适应新的变化 据我推断,PHP代码做出了这种改变,因为
$privateKey
从纯文本变成了十六进制编码。因此需要hex2bin
将其改回纯文本(将十六进制编码的文本改为纯文本;如果你问我,这是一个名称混乱的函数)
由于您的秘密
是纯文本,因此无需更改任何内容来匹配。但是还有其他方法可以改进代码。例如,将字节数组转换为十六进制编码字符串要容易得多
fun hmacHash(str: String, secret: String): String {
val sha256HMAC = Mac.getInstance("HmacSHA256")
val bytes = secret.toByteArray()
val secretKey = SecretKeySpec(bytes, "HmacSHA256")
sha256HMAC.init(secretKey)
return convertToHex(sha256HMAC.doFinal(str.toByteArray()))
}
fun convertToHex(data: ByteArray): String =
data.joinToString("") { "%02x".format(it) }
在Kotlin代码中传递给
hmacHash
的secret
中有什么类型的值?它是像“hello123”
那样的明文还是像“3a1b4c1d5e9f”
那样的十六进制编码它是作为密码传递的api密钥的值在我的例子中它存储为一个普通的随机字符串值这是我的android代码中的一个示例调用:hmacHash(${username}:${password}),api_-key)代码>谢谢你的代码建议,比以前好多了。我已经和创建API的开发人员谈过了,我们认为问题在于androids函数toByteArray
,因为它返回64字节而不是32字节。这就是授权失败的原因。@igoriic如果API_密钥的长度为32个字符,并且只包含ASCII字符,在与他再次交谈后,他说api密钥的编码长度为64个字符,基本上从字符串中提取2个字符将其转换为单字节,以获得32个版本。因此,如果a有一个字符串,比如:test
我会将te
转换为byte,将st
转换为byte,并将它们组合在一起,得到字节数组中的2个项。正如用简单的术语解释的,但从我所能得到的,转换并不是那么简单。