Pergunta sobre encoding, encryption, php, obfuscation – ofuscar ou criptografar alguns dados de texto simples em PHP

12

Eu preciso ofuscar ou criptografar alguns dados de texto simples no meu aplicativo php 5.2.

Eu prefiro uma solução que teria string de entrada e seqüência de saída manter o mesmo comprimento.

Isso não precisa ser extremamente forte, pois existem várias outras camadas de segurança no lugar. Strong seria bom, mas isso apenas evitaria que os programadores / dba / support people / etc lessem acidentalmente o texto de dentro do banco de dados.

consideracoes chave

EDITAR ADICIONAR Eu prefiro uma solução que teria string de entrada e seqüência de saída manter o mesmo comprimento.somente texto de string será ofuscado / criptografado para armazenamento em um banco de dadoso aplicativo php precisará ofuscar / criptografar os dados antes que o banco de dados seja salvo e será necessário ofuscar / desmistificar após a leitura do banco de dadosisso é uma modificação em um aplicativo existentesomente algumas colunas precisarão ser ofuscadas / criptografadassomente algumas linhas precisarão ser ofuscadas / criptografadas, com base em um campo Tipohá apenas alguns pontos de carregamento / salvamento para manipularO tamanho máximo da coluna já está determinado para alguns campos, mas não para outros, mas prefiro que uma solução funcione dentro do tamanho existente dos campos restritosEDITAR, ADICIONAR a chave provavelmente será um composto de algumas informações da chave primária + campos não editáveis

Aqui está uma tabela e dados do banco de dados de amostra:

<code>int           char(1) varchar(24)              int      date
MyPrimaryKey  RowType UserText                 UserNo   DateChange
------------  ------- ------------------------ -------- ----------------
1             N       nothing special here     43       6/20/2009 12:11am
2             N       same thing, wow!         78       6/23/2009 1:03pm
3             S       fBJKg}[email protected] 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am
</code>

O aplicativo carregaria e exibiria as linhas 1,2 e 4 normalmente. No entanto, seria condicionalmente (com base no tipo de linha) manipular o texto na linha 3 usando essa lógica de ofuscação / criptografia e desuso / descriptografar.

Alguém pode fornecer ofuscação / criptografar e desocultar / descriptografar código de funções, links e / ou ponteiro que ajudaria aqui?

obrigado!

EDITAR
Eu gosto da idéia de codificação simples base64, mas existe um método que pode manter os dados dentro de um tamanho fixo. Todos os métodos listados até agora têm o valor de saída maior que o valor de entrada. Este será um problema para algumas colunas, onde o usuário pode inserir 50 caracteres e é armazenado em uma coluna varchar (50).

@pure_code, em 2009, eu simplesmente não queria ver os dados durante o suporte ao aplicativo. Isso não foi de forma alguma uma tentativa de proteger os dados KM.
Há uma grande diferença entre codificação e criptografia, então não entendo por que você as trata como processos semelhantes. Você tem que responder primeiro algumas perguntas: os dados são confidenciais ou não, os desenvolvedores têm acesso direto ao banco de dados, se você pode aceitar que alguns desenvolvedores podem decodificar as mensagens, como esse esquema de proteção é útil. Se você estiver usando base64, qualquer um pode exportar a lista e decodificá-la. Wadih M.
Eu tenho a mesma situação e só vou fazer uma simples rotina13. user1637281
Se você não pode confiar nas pessoas que têm acesso direto aos seus sistemas e ao seu banco de dados, você precisa ser mais restritivo quanto a quem pode acessar os sistemas ou obter pessoas diferentes. Sean McSomething

Sua resposta

7   a resposta
17

para ofuscação simples use strtr () - Traduzir certos caracteres:
cordastrtr (string $ str, string $ from, string $ para)

codificar em php:

<code>$readable='This is a special test string ABC123 ([+,-!#$%&*])';    
$unreadable=strtr($readable,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
                           ,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                      );
print $unreadable; //outputs: "ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª"
</code>

decodificar em php:

<code>$unreadable='ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª';
$readable=strtr($unreadable,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                           ,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

               );
print $readable; //outputs: "This is a special test string ABC123 ([+,-!#$%&*])"
</code>

você pode facilmente replicar essa lógica no banco de dados, se necessário (sem loop):Usando uma tabela de números, por Erland Sommarskog

Eu realmente gosto da idéia base 64, mas eu preciso dos dados para caber em campos de banco de dados existentes. O rot13 () era bastante simples e mantinha o mesmo tamanho, mas esse strtr () é bom o suficiente para o meu propósito. KM.
Como você escolheu ou gerou as strings que você está usando acima? rot13 parece mais simples, por que a complexidade acrescentou? user1637281
Sim eu conheço. O que eu estava perguntando é como você gerou as duas seqüências. Estou com preguiça de contar, mas parece que você pegou ASCI (256 caracteres) e mudou 128 caracteres user1637281
@pure_code, a partir do manual: A codificação ROT13 simplesmente muda cada letra por 13 lugares no alfabetoenquanto deixa os caracteres não alfa intactos. Codificação e decodificação são feitas pela mesma função, passando uma string codificada como argumento retornará a versão original. isso não foi muito difícil, mas torna muito mais difícil obter informações da string codificada. KM.
provavelmente algo como isso, se você tem uma tabela de números é simples usando CHAR, algo nas linhas deselect char(number) from numbers where number<255 KM.
7

codificação base64? Usamos para usar isso para tornar as mensagens SMS em nosso SMS Gateway DB ilegíveis pelos desenvolvedores.

base64 torna o texto mais longo, não o mesmo comprimento ... Lucas - Better Coding Academy
qualquer um pode dizer que na primeira visão base64 é usado e decodificá-lo em um segundo. Como isso torna o SMS "ilegível"? dusoft
@dusoft: o seu SMS pretende ser "ilegível"? =) David Thomas
Nossa preocupação não era "criptografar" apenas para "não ser prontamente legível". Eu era um dos desenvolvedores e sim, eu poderia decodificá-lo em um segundo. karim79
4

Experimente estas funções PHPconvert_uuencode econvert_uudecode:

<code>function encrypt_decrypt ($data, $encrypt) {
    if ($encrypt == true) {
        $output = base64_encode (convert_uuencode ($data));
    } else {
        $output = convert_uudecode (base64_decode ($data));
    }
    return $output;
}

$enc_txt = encrypt_decrypt ("HELLO DATA", true);
echo $enc_txt."\n"; // KjIkNSwzJFxAMSQlNDAwYGAKYAo=
echo encrypt_decrypt ($enc_txt, false); // HELLO DATA
</code>
Por que você ignorou a palavra "comprimento"? Vishal Kumar Sahu
Funções não exigem atiruz
4

Se você tiver o mcrypt instalado (todos os meus ambientes PHP atuais), você poderia usarmcrypt_encrypt emcrypt_decrypt como isso:

<code>function encrypt ($text) {
  global $key;
  return mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345");
}

function decrypt ($secret) {
  global $key;
  return rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $secret, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345"), "\0");
}
</code>

que usa um sistema global$key e AES (muito forte).

As desvantagens são o desempenho (em comparação com as mais simples, como o Base64) e que, de alguma forma, você precisa consertar uma chave.

Felicidades,

2

mas é facilmente baixado e muito usado. Aquium tutorial rápido sobre o que você pode fazer com isso.

É melhor garantir que a chave usada para a criptografia seja armazenada em um local seguro, mas se você não estiver realmente preocupado com a segurança, provavelmente estará OK apenas codificando a chave em seu código em algum lugar.

5

Existem algumas opções.

Se você quer muito forte, você poderia olhar paramcrypt.

Mas se é apenas assim que os desenvolvedores não conseguem ler o texto sem algum trabalho para realmente fazê-lo. Então você poderia apenasBASE64 codifica ouuuencode isso

3

se você estiver usando o mysql em torno da versão 5, então você nem precisa de muito php para isso, você pode fazê-lo dentro da sua consulta com as funções de string mysqlencrypt(text, password) edecrypt(text, password)

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

DECODE(crypt_str,pass_str)

Descriptografa a string criptografada crypt_str usando pass_str como a senha. crypt_str deve ser uma string retornada de ENCODE ().

ENCODE(str,pass_str)

Criptografar str usando pass_str como a senha. Para descriptografar o resultado, use DECODE ().

O resultado é uma cadeia binária do mesmo comprimento que str.

A força da criptografia é baseada em quão bom é o gerador aleatório. Deve ser suficiente para seqüências curtas.

atualização: outra possibilidade seriarot13 ^^

mas o rot13 pode ser bastante legível para alguns. daver
Eu realmente gosto da mesma saída de cadeia de comprimento, no entanto, eu não estou no mysql. O rot13 parece promissor KM.
rot13 era de fato uma piada. rot13 é sempre uma piada ^^ stefs
Mas ... eu acho que o rot13 era uma piada. David Thomas

Perguntas relacionadas