Веб-приложение для цифровой подписи с Cryptographi c устройств в Django (Python) - PullRequest
0 голосов
/ 14 июля 2020

Я разрабатываю веб-приложение, и для него требуется PDF-документ, который должен быть подписан цифровой подписью с помощью устройства cryptographi c. Характеристики устройства указаны по следующей ссылке:

https://csrc.nist.gov/Projects/cryptographic-module-validation-program/Certificate/2825

Используемый язык программирования Python (Django). Я искал информацию на некоторых форумах и в научных c статьях. И большинство согласны с тем, что наиболее элегантным решением является использование расширения браузера. Я понимаю, что процесс подписания должен быть разработан на стороне клиента, точнее с использованием Javascript. Я хотел бы знать, есть ли какое-нибудь решение с открытым исходным кодом, которое может помочь мне.

models.py

class Documento(models.Model):
    area = models.ForeignKey(Area, on_delete=models.CASCADE, null=True, related_name="documentos")
    tipo_documento = models.ForeignKey(TipoDocumento, on_delete=models.CASCADE, null=True, related_name="tipo_documentos")
    naturaleza = models.ForeignKey(Naturaleza, on_delete=models.CASCADE, null=True, related_name="naturaleza_documentos")
    autor = models.ForeignKey(Funcionario, on_delete=models.CASCADE, related_name="autor_documentos")
    
    archivo_pdf = models.FileField('Subir Archivo PDF', upload_to='documentos/', validators=[validate_file, FileExtensionValidator(['pdf'])])
    nombre_documento = models.CharField('Nombre del Documento', max_length=200)
    numero_documento = models.CharField('Numeración del Documento', max_length=200, null=True, blank=True)    
    fecha = models.DateTimeField('Fecha de Subida', default=timezone.now)
    firmado = models.BooleanField(default=False)
    estado = models.BooleanField(default=True)    
    def __str__(self):
        return self.nombre_documento
    def save(self):
        self.nombre_documento = self.nombre_documento.upper()
        self.numero_documento = self.numero_documento.upper()
        if not self.fecha:
            self.fecha = datetime.datetime.now()
        super(Documento, self).save()
    def delete(self, *args, **kwargs):
        self.archivo_pdf.delete()        
        super().delete(*args, **kwargs)

class Firma(models.Model):
    documento = models.ForeignKey(Documento, on_delete=models.CASCADE, related_name="documentos_firmas")
    funcionario = models.ForeignKey(Funcionario, on_delete=models.SET_NULL, null=True, blank=True, related_name="funcionarios_firmas")
    fecha_firma = models.DateTimeField(default=timezone.now)    

    def save(self, *args, **kwargs):
        if not self.fecha_firma:
            self.fecha_firma = datetime.datetime.now()
        super(Firma, self).save(*args, **kwargs)
...