É necessária alguma experiência com o AEM Forms no JEE Designer, assim como a capacidade de acessar e chamar funções em objetos de script.
Início
Quando quiser ocultar uma senha no formulário PDF e não quiser que ela fique em texto não criptografado dentro do código-fonte ou em qualquer outro lugar no documento PDF, saber como gerar e trabalhar com hashes MD4, MD5, SHA-1 e SHA-256 é fundamental.
A ideia é ofuscar a senha gerando um hash exclusivo e armazenando esse hash no documento PDF. Esse hash exclusivo pode ser gerado por diferentes funções de hash e, neste artigo, mostrarei como gerá-los dentro do formulário PDF e como trabalhar com eles.
Uma função hash pega uma longa string (ou mensagem) de qualquer comprimento como entrada e produz uma string de comprimento fixo como saída, às vezes chamada de resumo da mensagem ou impressão digital.
O AEM Forms no JEE Designer permite implementar as diferentes funções de hash em objetos de script como JavaScript e executá-las dentro de um documento PDF dinâmico. Os PDF de de exemplo incluídos nos arquivos de amostra deste artigo usam implementações de código aberto das seguintes funções de hash:
MD4 e MD5 - projetados por Ronald Rivest
SHA-1 e SHA-256 - como são definidos pelo NIST
O maior benefício de usar hashes é que você não precisa comparar senhas diretamente comparando strings de texto claras; em vez disso, você pode comparar os dois hashes das duas senhas. Como é muito improvável que duas cadeias de caracteres diferentes tenham o mesmo hash, se ambos os hashes forem idênticos, você pode supor que as cadeias de caracteres comparadas (nesse caso, as senhas) também são idênticas.
Há alguns problemas de segurança bem conhecidos (as chamadas colisões de hash) com MD4 ou MD5. Devido a essas colisões de hash e outros hacks SHA-1 (incluindo tabelas de arco-íris), decidi me concentrar na função hash SHA-256 na segunda amostra. Para obter mais informações, consulte Colisão e Tabela de Arco-íris páginas da Wikipédia.
Ao abrir uma das duas amostras fornecidas no AEM Forms no JEE Designer, você encontrará os quatro objetos de script na paleta Hierarquia (consulte a Figura abaixo).
Para ver a implementação JavaScript das funções de hash nesses objetos de script, selecione o objeto de script e explore o código no Editor de scripts. Você pode ver como cada uma das seguintes funções de hash foi implementada:
Como você pode ver nessa lista, há diferentes funções disponíveis para os diferentes tipos de saída do hash. Você pode escolher entre hex_
para dígitos hexadecimais, b64_
para saída codificada em Base64, ou str_
para codificação de sequência simples.
Dependendo da função de hash escolhida, o comprimento do hash varia:
Os arquivos de exemplo deste artigo incluem dois PDF forms. A primeira amostra permite digitar uma string e gerar valores de hash MD4, MD5, SHA-1 e SHA-256 para a string. O segundo exemplo é um formulário simples que desbloqueia campos de texto se uma senha correta for inserida.
Siga as etapas abaixo para experimentar a primeira amostra:
O resultado da operação de hash é exibido no campo hash. O comprimento do hash varia dependendo da função de hash escolhida.
Todas as amostras usam dígitos hexadecimais como tipo de saída. Você pode usar o Editor de scripts para modificar as amostras e alterar o tipo de saída para Base64 ou String simples.
A segunda amostra demonstra como os hashes são comparados em segundo plano, sem precisar revelar a senha real. A senha digitada está com hash. A senha real, que é armazenada em um campo invisível, também tem hash. A senha é segura não porque está invisível, mas porque foi transformada em hash. Como é impossível reconstruir a senha a partir do valor com hash, é seguro expor a senha no formato com hash. A comparação é feita somente entre os hashes, não entre as senhas em texto não criptografado. Se os dois hashes forem os mesmos, você poderá supor que as senhas sejam idênticas.
Siga as etapas abaixo para experimentar a segunda amostra:
hashing_forms_sample2.pdf
com o AEM Forms no JEE Designer. Como alternativa, você pode usar o Adobe Reader ou o Adobe Acrobat Professional para abrir e exibir a amostra, mas não será possível ver o código-fonte.bob
alice
passwd_man_hashed
e passwd_woman_hashed
. Se você digitar a senha correta para o manual, os campos de texto rotulados Man 1
e Man 2
ficam acessíveis para que você possa digitar texto neles. O mesmo comportamento se aplica aos campos da mulher.O código para comparar os dois valores com hash e habilitar os campos de texto é simples:
if (soHASHING_SHA256.hex_sha256(this.rawValue) == passwd_man_hashed.rawValue){
VAL_man_1.access = "open";
VAL_man_2.access = "open";
VAL_man_1.borderColor = "0,255,0";
VAL_man_2.borderColor = "0,255,0";
}
Onde você precisaria de algo assim? Considere um formulário PDF que tenha campos que só devem ser preenchidos por indivíduos autorizados. Protegendo esses campos com uma senha, que não pode ser vista em texto não criptografado em nenhum lugar do documento, como em Sample_2.pdf, você pode garantir que esses campos estejam acessíveis somente para usuários que conhecem a senha.
Recomendo que você continue explorando os dois arquivos PDF de amostra. Você pode gerar novos valores de hash com Sample_1.pdf e usar os valores gerados para alterar a senha ou a função de hash usada em Sample_2.pdf. Os recursos listados na seção Atribuições também fornecem informações adicionais sobre hash e as implementações JavaScript específicas usadas neste artigo.