firmar y verificar firma utilizan node y javascript
Puedes darme los mismos pasos para firmar y verificar firma utilizan node y javascript ya que php es un lenguaje lado servidor y tengo desconficanza en subir la llave privada al servidor, seria recomendable hacerlo en el cliente? pienso que asi seria responsabilidad del usuario.
npm install node-forge
Verificar la Firma en Node.js
Para verificar la firma, puedes utilizar el siguiente código:
const forge = require('node-forge');
const fs = require('fs');
// Leer el certificado y la firma
const certificatePem = fs.readFileSync('path/to/certificate.pem', 'utf8');
const signature = fs.readFileSync('signature.bin');
// Cargar el certificado
const certificate = forge.pki.certificateFromPem(certificatePem);
// Documento original
const document = 'Este es el contenido del documento que quiero firmar';
// Crear un hash del documento
const md = forge.md.sha256.create();
md.update(document, 'utf8');
// Verificar la firma
const verified = certificate.publicKey.verify(md.digest().bytes(), signature);
if (verified) {
console.log('La firma es válida.');
} else {
console.log('La firma no es válida.');
}
Ejecución en el Cliente (Browser)
Para hacerlo en el navegador, puedes utilizar una versión adaptada del mismo código con node-forge. Aquí te dejo un ejemplo que puedes incluir en un archivo HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Firma Digital</title>
<script src="https://cdn.jsdelivr.net/npm/node-forge/dist/forge.min.js"></script>
</head>
<body>
<h1>Firma Digital</h1>
<input type="file" id="privateKeyFile" accept=".pem">
<input type="file" id="certificateFile" accept=".pem">
<button id="signButton">Firmar Documento</button>
<p id="result"></p>
<script>
document.getElementById('signButton').addEventListener('click', async () => {
const privateKeyFile = document.getElementById('privateKeyFile').files[0];
const certificateFile = document.getElementById('certificateFile').files[0];
if (!privateKeyFile || !certificateFile) {
alert('Por favor, selecciona los archivos de clave privada y certificado.');
return;
}
const privateKeyPem = await privateKeyFile.text();
const certificatePem = await certificateFile.text();
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
const document = 'Este es el contenido del documento que quiero firmar';
const md = forge.md.sha256.create();
md.update(document, 'utf8');
const signature = privateKey.sign(md);
document.getElementById('result').textContent = 'Documento firmado exitosamente.';
console.log('Firma:', forge.util.encode64(signature));
});
</script>
</body>
</html>
Recomendaciones de Seguridad
- Clave Privada en el Cliente: Mantener la clave privada en el lado del cliente es más seguro desde el punto de vista de la responsabilidad del usuario. Asegúrate de que los usuarios sean conscientes de la importancia de proteger su clave privada.
- Transmisión Segura: Utiliza HTTPS para transmitir datos de manera segura entre el cliente y el servidor.
- Almacenamiento Seguro: Si es necesario almacenar claves privadas en el cliente, utiliza el almacenamiento seguro del navegador, como
localStoragecon cifrado adicional.
Con estos pasos y recomendaciones, puedes implementar un sistema de firma digital en Node.js y JavaScript que mantenga la clave privada en el control del usuario. Si tienes más preguntas o necesitas más detalles, no dudes en preguntar.
Comentarios
Publicar un comentario