har*_*rkl 11 ecdsa ed25519 solana
创建签名消息后,我不确定如何使用生成的签名来使用公钥验证消息。
我的用例是,我想使用 Solana 钱包登录 API 服务器,其模式如下:
GET message: String (from API server)sign message with privateKeyPOST signature (to API server)verify signature with stored publicKey我尝试使用 nodeJScrypto.verify来解码 API 端的签名消息,但对缓冲区和椭圆曲线的挖掘有点超出了我的深度:
// Front-end code
const toHexString = (buffer: Buffer) =>
buffer.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
const data = new TextEncoder().encode('message to verify');
const signed = await wallet.sign(data, "hex");
await setLogin({ // sends API post call to backend
variables: {
publicAddress: walletPublicKey,
signature: toHexString(signed.signature),
},
});
// Current WIP for backend code
const ALGORITHM = "ed25519";
const fromHexString = (hexString) =>
new Uint8Array(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
const signature = fromHexString(args.signature);
const nonceUint8 = new TextEncoder().encode('message to verify');
const verified = crypto.verify(
ALGORITHM,
nonceUint8,
`-----BEGIN PUBLIC KEY-----\n${user.publicAddress}\n-----END PUBLIC KEY-----`,
signature
);
console.log("isVerified: ", verified);
Run Code Online (Sandbox Code Playgroud)
我很确定我的处理方式是错误的,并且我肯定缺少一个明显的方法。
随着空间的成熟,我预计验证函数或库将消耗以下输出const signed = await wallet.sign(data, "hex");
就像是:
import { VerifyMessage } from '@solana/web3.js';
const verified = VerifyMessage(message, publicKey, signature, 'hex');
Run Code Online (Sandbox Code Playgroud)
但经过三天的努力,我开始达到自己的极限,我的大脑开始衰竭。任何帮助或方向看起来非常感谢
har*_*rkl 13
根据出色的 Project Serum 不和谐开发人员的意见解决了。高级解决方案是使用 sol-wallet-adapter 存储库中也使用的库,即tweetnacl和bs58:
const signatureUint8 = base58.decode(args.signature);
const nonceUint8 = new TextEncoder().encode(user?.nonce);
const pubKeyUint8 = base58.decode(user?.publicAddress);
nacl.sign.detached.verify(nonceUint8, signatureUint8, pubKeyUint8)
// true
Run Code Online (Sandbox Code Playgroud)
小智 8
我建议留在 solana-labs Trail 并使用 tweetnacl
spl-token-wallet (sollet.io) 使用以下命令签署任意消息
nacl.sign.detached(message, this.account.secretKey)
在另一端,验证完成
nacl.sign.detached.verify
在@solana/web3.js https://github.com/solana-labs/solana/blob/master/web3.js/src/transaction.ts#L560
在你的后端使用nacl.sign.detached.verify,你应该会很好。我还建议避免任何数据格式操作,我不确定您想要做什么,但如果您确实验证每个步骤是否正确。
| 归档时间: |
|
| 查看次数: |
7369 次 |
| 最近记录: |