Cara membuat tanda tangan elektronik sendiri

Saya akan segera melakukan reservasi - Saya hampir amatir dalam hal yang terkait dengan tanda tangan digital elektronik (EDS). Baru-baru ini, didorong oleh rasa ingin tahu yang alami, saya memutuskan untuk menyortirnya sedikit dan menemukan 100500 artikel di Internet dengan topik memperoleh sertifikat tanda tangan digital di berbagai pusat sertifikasi, serta banyak instruksi untuk menggunakan berbagai aplikasi yang sudah jadi untuk menandatangani dokumen. Di beberapa tempat, disebutkan secara sepintas bahwa tanda tangan tidak terampil dapat dibuat secara independen jika Anda menggunakan layanan dari "programmer berpengalaman."


Saya juga ingin menjadi sedikit "berpengalaman" dan memahami dapur ini dari dalam. Untuk bersenang-senang, saya belajar cara membuat kunci PGP, menandatangani dokumen dengan tanda tangan yang tidak memenuhi syarat, dan memverifikasi keasliannya. Memahami bahwa tidak ada Amerika yang terbuka, saya tetap menawarkan tutorial singkat ini untuk amatir yang sama dengan saya dalam hal bekerja dengan tanda tangan digital. Saya mencoba untuk tidak mempelajari secara mendalam teori dan detailnya, tetapi hanya menulis pengantar kecil dan singkat untuk pertanyaan itu. Bagi mereka yang sudah bekerja dengan EDS, ini tidak mungkin menarik, tetapi untuk pemula, untuk kenalan pertama - tepat.


Apa itu tanda tangan elektronik?


Semua istilah dan definisi diberikan dalam hukum , oleh karena itu, kami akan menyatakan semuanya, seperti yang mereka katakan, dengan kata-kata Anda sendiri, tanpa berpura-pura keakuratan hukum absolut dari kata-kata.


Tanda tangan digital elektronik (EDS) adalah kumpulan alat yang memungkinkan untuk memverifikasi dengan jelas bahwa penulis dokumen (atau pelaku tindakan) adalah orang yang menyebut dirinya penulis. Dalam hal ini, EDS sepenuhnya analog dengan tanda tangan tradisional: jika dokumen "kertas" yang biasa menunjukkan bahwa penulisnya adalah Ivanov, dan tanda tangan Petrov di bawah, Anda dapat meragukan kepenulisan Ivanov.


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


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

Faktanya, itu saja. Sekarang, sesuai dengan ayat 5.23 dari GOST 7.0.97-2016 , Anda dapat menempatkan gambar yang indah ini pada dokumen (di tempat di mana tanda tangan tulisan tangan seharusnya berada):



All Articles