So erstellen Sie selbst eine elektronische Signatur

Ich werde sofort eine Reservierung vornehmen - ich bin fast ein Amateur in Sachen elektronischer digitaler Signatur (EDS). Aus natürlicher Neugier habe ich mich kürzlich entschlossen, dies ein wenig zu klären, und im Internet 100500 Artikel zum Thema Erhalt von Zertifikaten für digitale Signaturen in verschiedenen Zertifizierungszentren sowie zahlreiche Anweisungen zur Verwendung verschiedener vorgefertigter Anwendungen zum Signieren von Dokumenten gefunden. An einigen Stellen wurde nebenbei erwähnt, dass eine ungelernte Signatur unabhängig erstellt werden kann, wenn Sie die Dienste eines "erfahrenen Programmierers" nutzen.


Ich wollte auch wenigstens ein wenig „erfahren“ werden und diese Küche von innen verstehen. Zum Spaß habe ich gelernt, wie man PGP-Schlüssel generiert, Dokumente mit einer nicht qualifizierten Signatur signiert und deren Authentizität überprüft. Da ich verstehe, dass kein Amerika offen ist, biete ich dieses kurze Tutorial dennoch für Amateure an, die in Sachen Arbeit mit digitalen Signaturen mit mir identisch sind. Ich habe nicht besonders versucht, mich mit Theorie und Details zu befassen, sondern nur eine kleine und kurze Einführung in die Frage zu schreiben. Für diejenigen, die bereits mit EDS arbeiten, ist dies wahrscheinlich nicht interessant, aber für Anfänger, für die erste Bekanntschaft - genau richtig.


Was ist eine elektronische Signatur?


Alle Begriffe und Definitionen sind im Gesetz festgelegt , daher werden wir alles, wie sie sagen, in Ihren eigenen Worten angeben, ohne die absolute rechtliche Richtigkeit des Wortlauts vorzutäuschen.


Eine elektronische digitale Signatur (EDS) ist eine Sammlung von Tools, mit denen eindeutig überprüft werden kann, ob der Autor eines Dokuments (oder der Ausführende einer Aktion) genau die Person ist, die sich selbst als Autor bezeichnet. In diesem Sinne ist das EDS völlig analog zur traditionellen Unterschrift: Wenn das übliche "Papier" -Dokument angibt, dass sein Autor Ivanov ist, und Petrovs Unterschrift unten steht, können Sie zu Recht an Ivanovs Urheberschaft zweifeln.


. ; ( ), — . , , , , , .


: ( , ). ( ) , . , : , 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;
}

Das ist in der Tat alles. Jetzt können Sie gemäß Abschnitt 5.23 von GOST 7.0.97–2016 dieses schöne Bild auf dem Dokument platzieren (an der Stelle, an der sich die handschriftliche Unterschrift befinden sollte):



All Articles