Quiero usar ed25519 para firmar mi mensaje. Y encontré TweetNaCl.js que tiene el método Signatures para lograr mi objetivo.
Al hacer referencia al ejemplo mínimo de firmas de clave pública de TweetNaCl.js y firmas de documentos oficiales, aquí está mi código de prueba codesandbox .
const keyPair = nacl.sign.keyPair(); const secretKey = keyPair.secretKey; const publicKey = keyPair.publicKey; const secretKeyB64 = encodeBase64(secretKey); const publicKeyB64 = encodeBase64(publicKey); console.log("secretKeyB64", secretKeyB64); console.log("publicKeyB64", publicKeyB64); const msgStr = "My unencrypted message"; const msg = decodeUTF8(msgStr); const signature = nacl.sign(msg, secretKey); const signatureB64 = encodeBase64(signature); console.log("signatureB64", signatureB64); const verifiedMsg = nacl.sign.open(signature, publicKey); console.log(encodeUTF8(verifiedMsg)); El registro de la consola de encodeUTF8(verifiedMsg) parece no tener problemas y es igual que msgStr .
Pero me doy cuenta de que cuando coloco publicKeyB64 , signatureB64 y msgStr en la página de ejemplo de tweetnacl.js ( firmas de clave pública ) para verificarlo, responde el error Bad signature length: must be 64 bytes .
Si coloco secretKeyB64 en la página de firma de ejemplo y hago clic en "Firmar", la firma parece más corta que la que creé a partir del código de Codesandbox.
¿Hay algo que me perdí?
Descubrí este problema 20 minutos después... ¡¿Gracias por el StackOverflow?!
Registré la signature en la consola y descubrí que su longitud es superior a 64. Después de revisar las firmas , encontré otro método nacl.sign.detached(message, secretKey) y su longitud era 64.
Después de codificarBase64 y colocarlo en la página de ejemplo de tweetnacl.js (firmas de clave pública) para verificarlo, ¡funciona!