我想在客户端设备上使用通过Ed25519生成的私钥对JWS(json web签名)进行签名。然后将这个签名发送到我的后端,并用公钥验证它。为了熟悉这个过程,我想尝试在node js中对JWS进行签名和验证
我的私钥和公钥都已生成,可以在base58中使用。这是我目前使用Ed25519私钥签署JWT的尝试:
const { SignJWT } = require("jose/jwt/sign");
const bs50 = require("bs58");
async function main() {
const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";
const publicKeyBuffer = bs50.decode(publicBase58);
const privateKeyBuffer = bs50.decode(privateKeyBase58);
const publicKey = new Uint8Array(publicKeyBuffer);
const privateKey = new Uint8Array(privateKeyBuffer);
const jwt = await new SignJWT({
subject: "uuid",
})
.setProtectedHeader({ alg: "EdDSA" })
.setExpirationTime("2h")
.sign(privateKey);
console.log(jwt);
}
密钥必须是KeyObject或CryptoKey类型之一。收到一个Uint8Array的实例
当试图使用符号()
函数时,我得到上面的错误,因为我的私有密钥是类型Uint8Array
,唯一接受的类型是KeyObject
或CryptoKey
,但我不知道如何转换我的Uint8数组成KeyObject
或CryptoKeys
。
我从这个答案中得到了一些代码片段
您需要密钥的格式与该节点相同。js承认。KeyObject create*密钥API识别密钥,并且该密钥在中受支持-对于Ed25519密钥,即假设节点。js
下面是一个使用DER的片段。
js prettyprint-override">import { SignJWT } from "jose/jwt/sign"
import { jwtVerify } from "jose/jwt/verify"
import bs58 from "bs58"
import { createPrivateKey, createPublicKey } from "crypto"
(async function main() {
const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";
let publicKey = bs58.decode(publicBase58);
let privateKey = bs58.decode(privateKeyBase58);
publicKey = createPublicKey({
key: Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), publicKey]),
format: "der",
type: "spki",
});
privateKey = createPrivateKey({
key: Buffer.concat([
Buffer.from("302e020100300506032b657004220420", "hex"),
privateKey,
]),
format: "der",
type: "pkcs8",
})
const jwt = await new SignJWT({
subject: "uuid",
})
.setProtectedHeader({ alg: "EdDSA" })
.setExpirationTime("2h")
.sign(privateKey);
console.log(await jwtVerify(jwt, publicKey))
})()
这里有一个使用JWK的。
import { SignJWT } from "jose/jwt/sign"
import { jwtVerify } from "jose/jwt/verify"
import bs58 from "bs58"
import { createPrivateKey, createPublicKey } from "crypto"
(async function main() {
const publicBase58 = "A77GCUCZ7FAuXVMKtwwXyFhMa158XsaoGKHYNnJ1q3pv";
const privateKeyBase58 = "BE1VM7rTRJReLsTLLG4JMNX5ozcp7qpmMuRht9zB1UjU";
let publicKey = bs58.decode(publicBase58);
let privateKey = bs58.decode(privateKeyBase58);
publicKey = createPublicKey({
key: {
kty: "OKP",
crv: "Ed25519",
x: publicKey.toString("base64url")
},
format: "jwk"
});
privateKey = createPrivateKey({
key: {
kty: "OKP",
crv: "Ed25519",
x: publicKey.toString("base64url"),
d: privateKey.toString("base64url"),
},
format: "jwk"
})
const jwt = await new SignJWT({
subject: "uuid",
})
.setProtectedHeader({ alg: "EdDSA" })
.setExpirationTime("2h")
.sign(privateKey);
console.log(await jwtVerify(jwt, publicKey))
})()
我有一个包含EC私钥的文件: 我有一个证书,它的公钥对应于私钥: 在 pem 格式中: 以txt格式: 我正在努力完成两件事: < li >使用ecdsa-with-SHA256签名算法使用私钥对字节数组进行签名 < li >使用证书中的公钥验证签名是否正确 我尝试过使用充气城堡图书馆。这是我到目前为止所拥有的。我的断言是失败的。
问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载
我在nodejs中有一个非常小的代码,我在其中签名一个字符串,然后尝试使用openssl生成的节点密码和密钥对来验证它。无论我尝试什么,结果总是“错误”,签名无法验证。 生成公钥/私钥对: 生成的密钥是(我不在乎是否公开): 然后,这是我的节点代码: 我尝试使用不同的算法和编码。我已经读了带有"fs"的PEM文件,也没有运气。我错过了什么?顺便说一句,这些键使用npm URSA模块完美工作,所以我
这可能吗?如何从命令行执行此操作?
我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?
HTTP/REST-需要对代码/token/etc进行身份验证,以便将数据传递到keyvault,以便keyvault将使用密钥库中的密钥对数据进行签名。 Azure有很多文档介绍如何注册我的应用程序,在密钥库中为它创建凭据,然后通过OATH2对它进行身份验证(第一步是通过REST获得代码(然后是令牌?)),我一直被重定向登录。 我是不是漏掉了什么?我希望我的python脚本在无人值守的情况下运行