Cómo hacer una firma electrónica usted mismo

Haré una reserva de inmediato: soy casi un aficionado en asuntos relacionados con la firma digital electrónica (EDS). Recientemente, impulsado por la curiosidad natural, decidí resolver esto un poco y encontré 100,500 artículos en Internet sobre el tema de obtener certificados de firma digital en varios centros de certificación, así como numerosas instrucciones para usar varias aplicaciones listas para firmar documentos. En algunos lugares, se mencionó de pasada que una firma no calificada se puede hacer de forma independiente si utiliza los servicios de un "programador experimentado".


También quería ser al menos un poco "experimentado" y entender esta cocina desde adentro. Por diversión, aprendí a generar claves PGP, firmar documentos con una firma no calificada y verificar su autenticidad. Comprendiendo que Estados Unidos no está abierto, sin embargo, ofrezco este breve tutorial para aficionados que son iguales a mí en asuntos de trabajo con EDS. Intenté no profundizar particularmente en la teoría y los detalles, sino escribir solo una pequeña y breve introducción a la pregunta. Para aquellos que ya trabajan con EDS, es poco probable que esto sea interesante, pero para los principiantes, por primera vez, es justo.


¿Qué es una firma electrónica?


Todos los términos y definiciones se dan en la ley , por lo tanto, declararemos todo, como dicen, en sus propias palabras, sin pretender la precisión legal absoluta de la redacción.


Una firma digital electrónica (EDS) es una colección de herramientas que permite verificar claramente que el autor de un documento (o el ejecutor de una acción) es exactamente la persona que se hace llamar autor. En este sentido, el EDS es completamente análogo a la firma tradicional: si el documento "en papel" habitual indica que su autor es Ivanov, y la firma de Petrov está debajo, puede dudar con razón de la autoría de Ivanov.


Una firma electrónica es simple y mejorada . Una firma simple no implica el uso de algoritmos criptográficos estándar; todos los métodos de autenticación (que establecen la autoría) que se inventaron antes de la era de EDS; esta es esencialmente una firma electrónica simple. Si, por ejemplo, se registró en un sitio web de servicios públicos, verificó su identidad al aparecer en un centro multifuncional y luego envió llamamientos a varios organismos gubernamentales a través de este sitio web, entonces su nombre de usuario y contraseña del sitio web de servicios públicos serán en este caso su simple firma electrónica.


Una vez conocí tal forma de autenticar documentos electrónicos en una organización: antes de enviar el documento, se preparó su hash ( , ). ( ) , . , : , fetch- ajax- . , : , .


. ; , , . - ( , , ), : . ; (public key), — (private key). , , .


, ( ? ) , , , . , , , . , , , .


, : , — . ( ) . , , , , - ! . ( ), , .


. , . : . ( ) . , , , , .


. (detach), . , - .


? : , . :


  • ;
  • , ;
  • , , ( ). !

, , , «». , . , , . : , . , ...


. , , , ( , ). ( ), . , , (fingerprint), , , . , , , , , . , ( 40 ).


, , , — , . . : , ( ). , , .


, (, ) , . , ( ): .


, : - (, ) . , , .


, ( ) ( ). , (, ). (, ) , , .



, . , , , (public key) (private key).


. , , PGP (Pretty Good Privacy). 1991 , (, OpenPGP). 1999 GNU Privacy Guard (GnuPG, GPG). GPG ; - Windows , , gpg4win. - .


, (- , - root')


gpg --full-generate-key

:


  • «RSA RSA ( )»;
  • , 2048 ;
  • « »;
  • , , , ; ;
  • , .

GPG , . , , , GPG . , , , .


( , , , , ) :


gpg --export -a "  " > public.key
gpg --export-secret-key -a "  " > private.key

, private.key , public.key .



, (ASCII) :


gpg -ba __

, asc. , , privet.doc, privet.doc.asc. , , privet.sig, .


, , , :


#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
from tkFileDialog import *
import os, sys, tkMessageBox

def die(event):
    sys.exit(0)

root = Tk()
w = root.winfo_screenwidth()//2 - 400
h = root.winfo_screenheight()//2 - 300
root.geometry("800x600+{}+{}".format(w, h))
root.title(" ")

flName = askopenfilename(title=" ?")

if flName:
    os.system("gpg -ba " + flName)
    button = Button(text=" ")
    button.bind("<Button-1>", die)
    button.pack(expand=YES, anchor=CENTER)
else:
    die()

root.mainloop()


, , , ( ) , :


gpg --verify __ __

- (, ):


  • public.key , () , , GPG;
  • - , .

- ( , ) .


, OpenPGP.js; ( — 506 ) dist/lightweight/openpgp.min.js html- ( meta-):


<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body>

<label for="doc">   </label>
<input id="doc" type="file" onChange="readDoc('doc')">

<label for="sig">   </label>
<input id="sig" type="file" onChange="readDoc('sig')">

<button type="button" disabled onClick="check()"></button>
<output></output>

<script src="openpgp.min.js"></script>
<script src="validate.js"></script>

</body>
</html>

, public.key openpgp.min.js , .


validate.js:


"use strict";
let cont   = {doc:'', sig:''},
    flag   = {doc:false, sig:false},
    pubkey = '',
    mess   = '';

//    ( ),
//    ( )
const readDoc = contKey => {
    let reader = new FileReader();
    reader.onload  = async e => {
        cont[contKey] = contKey == "sig" ?
                        e.target.result :
                        new Uint8Array(e.target.result);
        flag[contKey] = true;
        pubkey = await (await fetch("public.key")).text();   
        if (flag["doc"] && flag["sig"])
            document.querySelector("button").disabled = false;
    }
    reader.onerror = err => alert("  ");

    let fileObj = document.querySelector(`#${contKey}`).files[0];
    if (contKey == "sig") reader.readAsText(fileObj);
    else                  reader.readAsArrayBuffer(fileObj);
}

//  
const check = async () => {
    try {   
       const verified = await openpgp.verify({
           message:    openpgp.message.fromBinary(cont["doc"]),
           signature:  await openpgp.signature.readArmored(cont["sig"]),
           publicKeys: (await openpgp.key.readArmored(pubkey)).keys
       });
       const {valid} = verified.signatures[0];
       mess = "    !";
       if (valid) mess = "   .";
    } catch(e) {mess = "    .";}
    document.querySelector("output").innerHTML = mess;
}

Eso, de hecho, es todo. Ahora, de acuerdo con la cláusula 5.23 de GOST 7.0.97–2016 , puede colocar esta hermosa imagen en el documento (en el lugar donde debe estar la firma manuscrita):



All Articles