java - nodejs和kotlin中的SHA256不同哈希
问题描述
我在两个不同的模块中使用 SHA 256 哈希生成器。一个模块是用 Kotlin 编写的,另一个是使用 nodejs 加密 API 编写的。nodejs 和 kotlin 中的哈希值略有不同。
Kotlin 代码
import java.security.MessageDigest
import java.util.Base64
fun main() {
val md = MessageDigest.getInstance("SHA-256")
val input = "test".toByteArray(Charsets.UTF_8)
val bytes = md.digest(input)
println(Base64.getUrlEncoder().encodeToString(bytes))
}
节点代码
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('test');
console.log(crypto.createHash('sha256').update('test', 'utf8').digest('base64'));
kotlin 代码输出n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg=
where 作为 nodejs 代码输出n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=
。我无法确定我做错了什么?
解决方案
我相信您的问题是由 kotlin: 提供的 urlencoded base64 引起的Base64.getUrlEncoder()
。
在 kotlin 中,您得到的是 base64 url 编码,而在节点上,您只有 base64。
也许这可以帮助您确定假设是否正确。在节点添加 url 编码:
// https://www.npmjs.com/package/base64url
const base64url = require('base64url');
console.log(base64url(crypto.createHash('sha256').update('test', 'utf8')));
推荐阅读
- c# - 打开连接问题,在 IIS 中配置 https 后使用 http
- sql - Oracle REPLACE 不起作用 - 换行符仍在发生
- python - 水平绘制具有层次结构的networkx图并操纵箭头的长度
- sas - 使用 SAS 的 proc sql 或数据步骤替换表中单个单元格的值?
- java - 将 Java 流计数为整数,而不是长
- ios - 如何在不出现键值编码兼容错误的情况下创建对 ScrollView 的引用出口
- linq - 如果where子句不匹配,想用linq返回所有数据
- azure - 在 Azure 数据工厂中添加日期列
- r - 在 R 中:按日期从数据框中提取特定列并将基本列保留在开头
- kubernetes - 使用 svc.cluster.local URL 访问 RabbitMQ