java - Crypto 将代码从 Node js 翻译为 Java

标签 java cryptography rsa licensing signature

我想检查离线模式下的登录: 我在node js上找到了以下代码

const crypto = require('crypto')
const {
  KEYGEN_PUBLIC_KEY,
  LICENSE_KEY
} = process.env

// Extract key and signature from the license key payload
const [encodedKey, encodedSignature] = LICENSE_KEY.split('.')

// Decode the base64 encoded key
const key = Buffer.from(encodedKey, 'base64').toString()

// Verify the signature
const verifier = crypto.createVerify('sha256')
verifier.write(key)
verifier.end()

const ok = verifier.verify(KEYGEN_PUBLIC_KEY, encodedSignature, 'base64')

之后我尝试在java上重写这段代码

byte[] publicBytes = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);

Signature sign = Signature.getInstance("SHA256withRSA");
sign.initVerify(pubKey);
byte[] decode = Base64.getDecoder().decode(signature.getBytes(StandardCharsets.UTF_8));
System.out.println(sign.verify(decode));

但这行不通。异常(exception)是线程“main”java.lang.IllegalArgumentException中的异常:非法base64字符2d 有人能帮我解决这个错误吗?

最佳答案

你能试试下面的代码吗?

byte[] publicBytes = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(publicBytes);
byte[] outputDigest = messageDigest.digest();

此后,您可以使用正常的 Base64 解码功能。 您可以引用下面的例子。 https://www.quickprogrammingtips.com/java/how-to-create-sha256-rsa-signature-using-java.html

关于java - Crypto 将代码从 Node js 翻译为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184943/

相关文章:

c# - 什么样的 RSASignaturePadding 与 PKCS#8 key 一起使用?

java - Java如何捕获泛型接口(interface)的泛型方法中的类型变量?

java - 错误: option -Xbootclasspath/p: not allowed with target 13 with netbean 11. 3、jdk 13.0.1

encryption - 从加密值+明文中找出AES key

c++ - 欧拉的巨数披

c++ - C# 中的 RSA C++ 等价物

java - 在小程序上画一个旋转的矩形

java - TableView不显示内容

django - 什么是浅键变换

java - 为什么这个 Java RSA 解密不起作用?