php - 如何将 php 函数转换为 kotlin android?
问题描述
我有一个正在处理的项目,它使用 API 来请求它,但为了执行它们,我需要先生成令牌。
在 API 更新之前一切正常,更新之后我不知道如何调整我的代码以使其再次工作。
这是更新前的代码(Android | Kotlin):
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()
}
这相当于这个PHP 代码:
hash_hmac('sha256', $string, $privateKey);
但现在更新后的 php 代码如下所示:
hash_hmac('sha256', $string, hex2bin($privateKey));
而且我不知道如何调整我的代码以使其适用于这一新变化。
解决方案
据我推测,PHP 代码做出了这种改变,因为它$privateKey
从纯文本变成了十六进制编码。因此hex2bin
需要将其更改回纯文本(hex2bin将十六进制编码的文本更改为纯文本;如果您问我,这是一个令人困惑的命名函数)。
由于您secret
是纯文本,因此您无需更改任何内容即可匹配。但是还有其他方法可以改进您的代码。例如,将字节数组转换为十六进制编码的字符串要比这容易得多。
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) }
推荐阅读
- pandas - 熊猫数据框:KeyError '
' - android - ANR:com.facebook.react.bridge.ModuleHolder.getModule
- r - t应用因因素而异的功能
- flutter - 将需要参数的函数传递给flutter中的子小部件
- android - Android单元测试如何测试observable和Subscriber
- c# - 使用实体框架时 ASP.NET Web 应用程序重新启动
- laravel - 有时|必需|电子邮件和有时|电子邮件验证规则之间的区别
- angular - Word 文档中未列出 Office.js API 样式
- c# - 如果我单击空白区域,C# DataGrid ContextMenuOpening 错误
- shell - 通过 shell 脚本调用 Snowsql 程序