Tengo un archivo PDF que quiero insertar una marca de agua digital invisible y frágil. ¿Cuáles son los algoritmos adecuados disponibles para esta tarea?
La mayoría de los lectores de PDF dejarán de leer el flujo de datos PDF al golpear el token %EOF
, y de todos modos ignorarían los comentarios que comiencen con %
.
Por lo tanto, sería perfectamente factible calcular HMAC-SHA1 y adjuntar el hash resultante al archivo PDF.
Esto no es, estrictamente hablando, una marca de agua , pero es invisible y frágil, según se solicita.
El archivo PDF resultante terminará en algo como
...
startxref
179091
%%EOF
%0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
a partir de la cual se puede calcular directamente la integridad.
Con la ayuda de la herramienta pdftk
, también puede descomprimir un PDF, manipular su flujo de metadatos de Adobe (si lo hay) e incrustar en él un HMAC XML, o incluso un comentario:
3 0 obj
<<
/Subtype /XML
/Length 1381
/Type /Metadata
>>
stream
<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
...
</x:xmpmeta>
<!-- 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 -->
<?xpacket end='w'?>
endstream
endobj
Se cambiará la longitud del flujo; Si hay suficiente holgura en el objeto XMP, puede evitarlo, pero no es necesario, ya que pdftk
en modo de compresión podrá recalcularlo y generar un PDF válido.
En este último caso, la información HMAC se comprimirá y no se podrá leer directamente. Necesitará pdftk
(o la biblioteca de iText, o ...) para descomprimir el PDF y volver a calcular su MAC.
El procedimiento sería el siguiente:
Puede hacer lo mismo con un objeto PDF incrustado en el flujo de PDF, por ejemplo. utilizando la biblioteca iText, pero esto sería mucho más complicado de hacer frágil . Los objetos PDF son en gran medida independientes entre sí, por lo que debería recurrir nuevamente a algo similar a HMAC, esta vez a nivel de objeto, y luego incrustar el valor como, por ejemplo, Texto 100% transparente, o texto fuera de los límites de la página (conozco editores de libros electrónicos que emplean una o ambas técnicas).
También con iText, pero estos no son frágiles , son algoritmos que modulan el espaciado de los objetos de texto en la página. La mayoría de los objetos de texto no están alineados con un múltiplo entero de la unidad de página:
24.4801 0 Td
[(w)4001.47(atermarking)]TJ
59.7 0 Td
(algorithms)Tj
46.9801 0 Td
y puede determinar fácilmente el paso mínimo que será visible a simple vista, por ejemplo. 0.005. Luego, simplemente redondee todas las posiciones de texto, en el orden en que aparecen, al múltiplo impar más cercano del paso, si desea codificar un 1. O al múltiplo par más cercano del paso, si quieres codificar un 0.
Tal marca de agua sobrevivirá a la copia y estará presente de forma independiente en cada página; con la adición de recuperación de errores adecuada (código turbo, Reed-Solomon ...), también sobrevivirá a la eliminación o adición de algunos objetos (no demasiados, por supuesto ...) en la página. También es posible que sobreviva a imprimir y se pueda recuperar de un escaneo de una página impresa.
Lo haría al implementar un método iText RenderListener
, cuyo método renderText
capturaría el origen del cuadro de texto y lo "modularía" según se solicitó antes de enviarlo al PdfCopy
.
Lea otras preguntas en las etiquetas cryptography steganography