Ocultar llaves internas en pdf

Ocultar llaves internas en pdf

Cuando abro el pdf generado, pdflatexpor ejemplo, en Firefox, la URL al pasar el cursor sobre una referencia muestra la clave bib interna. ¿Cómo puedo prevenir esto?

Considere el siguiente MWE:

mwe.tex

\documentclass{article}

\usepackage[backend=biber]{biblatex}
\addbibresource{bib.bib}

\usepackage{hyperref}

\begin{document} 

Test\cite{secretbibkey}

\printbibliography

\end{document}

babero.babero

@article{secretbibkey,
    author = {Joe},
    title = {Just a title},
    number = {ABCD-E/2008/ab/1234},
    institution = {University},
    year = {2008}
}

Ahora mira la siguiente captura de pantalla: Captura de pantalla que muestra que puede ver la bibkey utilizada internamente Muestra la clave bib que utilicé al pasar el cursor sobre la cita (aparentemente la captura de pantalla no incluye mi cursor, pero estaba encima del "1" verde). ¿Hay alguna forma de aleatorizar/anonimizar estas claves de URL?

Respuesta1

Puedes probar algo como esto. No estoy seguro de si \int_to_alphamaneja todos los caracteres y entradas que pueden aparecer en un destino, y si puede llevar a destinos idénticos, pero fue la mejor función expandible que encontré por ahora. Codificará todos los destinos, también el de secciones y etiquetas. Para codificar sólo las claves babero se necesitarían varios cambios en el biblatexcódigo.

\documentclass{article}

\usepackage[backend=biber]{biblatex}
\addbibresource{test.bib}

\usepackage{hyperref}
\ExplSyntaxOn
\cs_new:Npn \pix_scrample_dest:n #1 {\int_eval:n{\int_from_alph:n{#1} + 2}} %2= secret number 
\def\HyperDestNameFilter#1{\exp_args:Ne\tl_map_function:nN {#1}\pix_scrample_dest:n}
\ExplSyntaxOff

\begin{document}

Test\cite{secretbibkey}

\printbibliography

\end{document}

Respuesta2

Si desea ocultar todo el etiquetado interno, Ulrike'srespuestaes mucho mejor, pero aquí hay una manera de ofuscar solo los enlaces creados mediante biblatexhashes MD5 (creo que los hash MD5 ya no se recomiendan para nada crítico para la seguridad, pero podría ser suficiente para sus propósitos).

El comando \blx@mdfivesumutilizado aquí requiere una versión relativamente reciente biblatex. Si estás atrapado con algo viejo biblatex, cárgate \usepackage{pdftexcmds}y di \let\blx@mdfivesum\pdf@mdfivesum.

La idea es cambiar todos los comandos de enlace de usar la clave de entrada a una versión hash de la clave de entrada.

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}

\makeatletter
\AtBeginDocument{%
  \protected\def\blx@anchor{%
    \xifinlist{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{\blx@anchors}
      {}
      {\listxadd\blx@anchors{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}%
       \hypertarget{cite.\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{}}}%
  \ifundef\hyper@natanchorstart
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection @\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hypertarget{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}}%
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection @\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hyper@natanchorstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography
\end{document}

Captura de pantalla del PDF con enlace ofuscado.


En caso de que prefiera un designador numérico (que, a diferencia del hash anterior, no se deriva en absoluto de la clave de entrada), utilice lo siguiente

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}

\makeatletter
\newcounter{blx@refnocount}

\newcommand*{\blx@getrefnocount}[1]{%
  \xifinlistcs{#1}{blx@refcounts@\the\c@refsection}
    {}
    {\stepcounter{blx@refnocount}%
     \csnumgdef{blx@refcount@\the\c@refsection @#1}{\value{blx@refnocount}}%
     \listcsxadd{blx@refcounts@\the\c@refsection}{#1}}%
  \letcs\blx@thisrefcount{blx@refcount@\the\c@refsection @#1}}

\AtBeginDocument{%
  \ifundef\hyper@natanchorstart
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \blx@getrefnocount{\abx@field@entrykey}%
          \hypertarget{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}{}}}%
     \long\def\blx@bibhyperref[#1]#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyperlink{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
          \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyperlink{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
          \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hypertarget{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
         \blx@sfsave}\blx@sfrest}}%
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \blx@getrefnocount{\abx@field@entrykey}%
          \hyper@natanchorstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
          \hyper@natanchorend}}%
     \long\def\blx@bibhyperref[#1]#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natlinkstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natlinkstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natanchorstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography

\autocite{sigfridsson,worman,geer,nussbaum}
\end{document}

Respuesta3

Puede posprocesar el pdf creado con algunas herramientas de línea de comandos para buscar claves de citas y reemplazarlas en la fuente del pdf.

Primero debe descomprimir el pdf para permitir la búsqueda textual y reemplazarlo, por ejemplo con pdftk.

En el pdf sin comprimir los enlaces se ven así:

3 0 obj 
<<
/Border [0 0 1]
/Subtype /Link
/H /I
/Type /Annot
/C [0 1 0]
/Rect [169.08 653.748 176.054 665.704]
/A 
<<
/D (cite.0@secretbibkey)
/S /GoTo
>>
>>
endobj 

y las partes correspondientes más abajo:

34 0 obj 
<<
/Names [(Doc-Start) 22 0 R (cite.0@secretbibkey) 21 0 R (page.1) 14 0 R (section*.1) 18 0 R]
/Limits [(Doc-Start) (section*.1)]
>>
endobj

Ahora puede encontrar grepla fuente del patrón /D (cite.0@[some key])y almacenar solo la parte clave.

Luego, al recorrer todas las claves, puede generar una clave de reemplazo, por ejemplo, la md5suma de verificación (que razonablemente se puede esperar que sea única para cada clave).

A continuación, puede reemplazar todas las apariciones de la clave con el reemplazo usando sed.

Al final del ciclo, vuelves a comprimir el pdf pdftky listo.

Guión completo (llamar con bash myscript.sh mypdf.pdf):

pdftk $1 output "raw$1" uncompress
grep -aoP "\/D \(\Kcite.0@[^\)]+(?=\))" "raw$1" | while read -r line ; do
   echo $line
   citehash=`echo $line|md5sum|awk '{ print $1 }'`
   sed -i "s/$line/$citehash/g" "raw$1"
done
pdftk "raw$1" output $1 compress

Información sobre herramientas del enlace resultante en Firefox:

ingrese la descripción de la imagen aquí

Bonificación adicional: el enlace aún funciona.

información relacionada