如何将时间戳放入 android 生成的加密签名中
How to put timestamp in android generated crypto signature
我有的是没有页眉、页脚和空格的私钥(这是测试版)
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0m4yLz+sdzZtBG9Q3HQ9++wcfq1O4hOWgSBMb/A6eijyhRANCAAQeB0fBl2D7HZOKVBjpPiU2jabzNxQU4ZYrJ+MSA3LpzZxmRk2JaFHNujjkJghQT19HHjg3Fnkb8Y9oIhB9neXBI
android 中的这段代码生成所需格式的签名。
val signatureSHA256 = Signature.getInstance("SHA256withECDSA")
val encoded = Base64.decode(privateKeyHere, Base64.DEFAULT)
val privateKey: PrivateKey = KeyFactory.getInstance("EC").generatePrivate(PKCS8EncodedKeySpec(encoded))
signatureSHA256.initSign(privateKey)
val finalSignature = signatureSHA256.sign().toHexString()
//Somewhere
fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
和 return 时间戳的函数:
fun getXTimestamp(): Long {
return (System.currentTimeMillis() / 1000L)
}
来自 android 我正在获取 finalSignature 和 getXTimestamp()
我需要在 php 脚本中验证我的签名:
$timestamp = '1625730735';
$public_key = "
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHgdHwZdg+x2TilQY6T4lNo2m8zcU
FGWKyfjEgNy6c2cZkZNiWhRzbo45CYIUE9fRx44NxZ5G/GPaCIQfZ3lwSA==
-----END PUBLIC KEY-----
";
//hex2bin("finalSignature")
$sign = hex2bin("3045022048011d511094a5270c528ca5064b07084e36ccfd2ee3f5e1e20278fb5d83cdba022100d71a0096ef2c6288554a51017a89374b18c7e84ba7031a43d67f53d7ce89152c");
$result = openssl_verify($timestamp, $sign, $public_key, OPENSSL_ALGO_SHA256);
print $result;
现在 php 脚本从控制台启动 returns 0 但应该 return 1。
我想我应该以某种方式更新或在签名中放置时间戳。
我试图把它作为字节放在 update() 中,但仍然是 0
谁能帮忙?)
在 PHP 端(“验证”),您使用 'timestamp' 作为文本字符串作为 openssl_verify 函数的输入。
在 Kotlin 端,您需要做同样的事情——将时间戳作为字符串获取,并将其用作 sign.update 调用的输入,使用 [伪代码] timestamp-string.getBytes(StandardCharset. UTF8) 作为输入。
由于我不熟悉 Kotlin,所以我使用 @Andrej Kijonok 评论中的代码解决了问题:-)
val signatureTimestamp = getXTimestamp().toString().toByteArray(Charsets.UTF_8)
signatureSHA256.initSign(privateKey)
signatureSHA256.update(signatureTimestamp)
我有的是没有页眉、页脚和空格的私钥(这是测试版)
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0m4yLz+sdzZtBG9Q3HQ9++wcfq1O4hOWgSBMb/A6eijyhRANCAAQeB0fBl2D7HZOKVBjpPiU2jabzNxQU4ZYrJ+MSA3LpzZxmRk2JaFHNujjkJghQT19HHjg3Fnkb8Y9oIhB9neXBI
android 中的这段代码生成所需格式的签名。
val signatureSHA256 = Signature.getInstance("SHA256withECDSA")
val encoded = Base64.decode(privateKeyHere, Base64.DEFAULT)
val privateKey: PrivateKey = KeyFactory.getInstance("EC").generatePrivate(PKCS8EncodedKeySpec(encoded))
signatureSHA256.initSign(privateKey)
val finalSignature = signatureSHA256.sign().toHexString()
//Somewhere
fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
和 return 时间戳的函数:
fun getXTimestamp(): Long {
return (System.currentTimeMillis() / 1000L)
}
来自 android 我正在获取 finalSignature 和 getXTimestamp() 我需要在 php 脚本中验证我的签名:
$timestamp = '1625730735';
$public_key = "
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHgdHwZdg+x2TilQY6T4lNo2m8zcU
FGWKyfjEgNy6c2cZkZNiWhRzbo45CYIUE9fRx44NxZ5G/GPaCIQfZ3lwSA==
-----END PUBLIC KEY-----
";
//hex2bin("finalSignature")
$sign = hex2bin("3045022048011d511094a5270c528ca5064b07084e36ccfd2ee3f5e1e20278fb5d83cdba022100d71a0096ef2c6288554a51017a89374b18c7e84ba7031a43d67f53d7ce89152c");
$result = openssl_verify($timestamp, $sign, $public_key, OPENSSL_ALGO_SHA256);
print $result;
现在 php 脚本从控制台启动 returns 0 但应该 return 1。 我想我应该以某种方式更新或在签名中放置时间戳。 我试图把它作为字节放在 update() 中,但仍然是 0 谁能帮忙?)
在 PHP 端(“验证”),您使用 'timestamp' 作为文本字符串作为 openssl_verify 函数的输入。
在 Kotlin 端,您需要做同样的事情——将时间戳作为字符串获取,并将其用作 sign.update 调用的输入,使用 [伪代码] timestamp-string.getBytes(StandardCharset. UTF8) 作为输入。
由于我不熟悉 Kotlin,所以我使用 @Andrej Kijonok 评论中的代码解决了问题:-)
val signatureTimestamp = getXTimestamp().toString().toByteArray(Charsets.UTF_8)
signatureSHA256.initSign(privateKey)
signatureSHA256.update(signatureTimestamp)