O que eu quero dizer é:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Talvez algo como:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- Em PHP, como você pode fazer isso?
Tentou usar Crypt_Blowfish
, mas não funcionou para mim.
Respostas:
Antes de fazer algo mais, procure entender a diferença entre criptografia e autenticação e por que você provavelmente deseja criptografia autenticada em vez de apenas criptografia .
Para implementar a criptografia autenticada, você deseja criptografar e depois o MAC. A ordem de criptografia e autenticação é muito importante! Uma das respostas existentes para essa pergunta cometeu esse erro; assim como muitas bibliotecas de criptografia escritas em PHP.
Você deve evitar implementar sua própria criptografia e, em vez disso, usar uma biblioteca segura criada e revisada por especialistas em criptografia.
Use libsodium se você tiver acesso ao PECL (ou sodium_compat se desejar libsodium sem PECL); caso contrário ...
Use defuse / php-encryption ; não role sua própria criptografia!
Ambas as bibliotecas vinculadas acima acima tornam fácil e simples implementar a criptografia autenticada em suas próprias bibliotecas.
Se você ainda deseja escrever e implantar sua própria biblioteca de criptografia, contra a sabedoria convencional de todo especialista em criptografia na Internet, estas são as etapas que você deve executar.
Criptografia:
Descriptografia:
hash_equals()
. Se falhar, aborte.Outras considerações de design:
mb_strlen()
emb_substr()
, usando o'8bit'
modo de conjunto de caracteres para evitarmbstring.func_overload
problemas.mcrypt_create_iv()
, NÃO USEMCRYPT_RAND
!bin2hex()
,base64_encode()
etc. podem vazar informações sobre suas chaves de criptografia via tempo de cache. Evite-os, se possível.Mesmo se você seguir o conselho dado aqui, muita coisa pode dar errado com a criptografia. Sempre tenha um especialista em criptografia revisando sua implementação. Se você não tiver a sorte de ser amigo pessoal de um estudante de criptografia da sua universidade local, sempre poderá tentar o fórum do Cryptography Stack Exchange para obter orientação.
Se você precisar de uma análise profissional de sua implementação, sempre poderá contratar uma equipe respeitável de consultores de segurança para revisar seu código de criptografia PHP (divulgação: meu empregador).
Importante: Quando não usar criptografia
Não criptografe senhas . Emvez disso,você deseja fazer o hash , usando um destes algoritmos de hash de senha:
Nunca use uma função de hash de uso geral (MD5, SHA256) para armazenamento de senha.
Não criptografe parâmetros de URL . É a ferramenta errada para o trabalho.
Exemplo de criptografia de seqüência de caracteres PHP com Libsodium
Se você estiver no PHP <7.2 ou não tiver o libsodium instalado, poderá usar o sódio_compat para obter o mesmo resultado (embora mais lento).
Em seguida, para testá-lo:
Halita - Libsodium Tornado Mais Fácil
Um dos projetos em que estou trabalhando é uma biblioteca de criptografia chamada Halite , que visa tornar o libsodium mais fácil e mais intuitivo.
Toda a criptografia subjacente é manipulada pelo libsodium.
Exemplo com defuse / php-encryption
Nota :
Crypto::encrypt()
retorna a saída codificada em hexadecimal.Gerenciamento de chave de criptografia
Se você estiver tentado a usar uma "senha", pare agora. Você precisa de uma chave de criptografia aleatória de 128 bits, não de uma senha memorável humana.
Você pode armazenar uma chave de criptografia para uso a longo prazo, como:
E, sob demanda, você pode recuperá-lo da seguinte forma:
Eu fortemente recomendo apenas armazenar uma chave gerada aleatoriamente para uso a longo prazo em vez de qualquer tipo de senha como a chave (ou para derivar a chave).
Se você estiver usando a biblioteca do Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
"Mas eu realmente quero usar uma senha."
É uma má ideia, mas tudo bem, eis como fazê-lo com segurança.
Primeiro, gere uma chave aleatória e armazene-a em uma constante.
Observe que você está adicionando trabalho extra e pode usar essa constante como chave e poupar muita dor de cabeça!
Em seguida, use PBKDF2 (assim) para obter uma chave de criptografia adequada da sua senha, em vez de criptografá-la diretamente.
Não use apenas uma senha de 16 caracteres. Sua chave de criptografia será comicamente quebrada.
fonte
password_hash()
e verifique com elaspassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Estou atrasado para a festa, mas, ao procurar a maneira correta de fazê-lo, encontrei esta página como uma das principais pesquisas do Google, então gostaria de compartilhar minha opinião sobre o problema, que considero ser atualizado no momento da redação deste post (início de 2017). A partir do PHP 7.1.0, o
mcrypt_decrypt
emcrypt_encrypt
será descontinuado, portanto, a construção de código à prova de futuro deve usar o openssl_encrypt e o openssl_decryptVocê pode fazer algo como:
Você também pode usar outros métodos de picador, dependendo da sua necessidade de segurança. Para descobrir os métodos disponíveis do picador, consulte a função openssl_get_cipher_methods .
fonte
prod_id=123
mas não quero tornar o 123 legível para todos, no entanto, mesmo que eles possam lê-lo, não será um problema. Um invasor capaz de substituir o 123 por um valor personalizado não causará nenhum dano, ele só poderá obter detalhes de qualquer outro produto, mas Joe Average User não terá idéia de como obter detalhes para produto 124, por exemplo. Para um cenário como esse, é uma solução perfeita, para segurança, é impossível!O que não fazer
Eu entendi. Na verdade, eu encontrei alguma resposta no google e apenas modifiquei algo. O resultado é completamente inseguro.
fonte
base64_encode(encrypt($string))
- Para descriptografá-lo:decrypt(base64_decode($encrypted))
mcrypt_encrypt
substituindo o código de exemplo : php.net/manual/en/function.mcrypt-encrypt.php . Observe que, analisando-o agora, provavelmente deve haver umrtrim
caractere for"\0"
no final.Para framework Laravel
Se você estiver usando a estrutura do Laravel, é mais fácil criptografar e descriptografar com funções internas.
fonte
Atualizada
Versão pronta para PHP 7. Ele usa a função openssl_encrypt da PHP OpenSSL Library .
fonte
Eu deixei essa resposta para fins históricos - mas alguns dos métodos agora estão obsoletos, o método de criptografia DES não é uma prática recomendada etc.
Não atualizei este código por dois motivos: 1) Não trabalho mais com métodos de criptografia manualmente no PHP e 2) esse código ainda serve ao objetivo a que se destinava: demonstrar o conceito simplista e mínimo de como a criptografia pode funcionar em PHP.
Se você encontrar um tipo de fonte similarmente simplista, "criptografia PHP para manequins", que pode iniciar as pessoas em 10 a 20 linhas de código ou menos, informe-me nos comentários.
Além disso, aproveite este episódio clássico da resposta de criptografia minimalista do PHP4 do início da era.
Idealmente, você tem - ou pode obter - acesso à biblioteca PHP mcrypt, pois é certamente uma variedade de tarefas popular e muito útil. Aqui está um resumo dos diferentes tipos de criptografia e algum código de exemplo: Técnicas de criptografia no PHP
Alguns avisos:
1) Nunca use criptografia reversível ou "simétrica" quando houver um hash unidirecional.
2) Se os dados forem realmente confidenciais, como cartão de crédito ou números de previdência social, pare; você precisa de mais do que qualquer parte do código fornecer, mas precisa de uma biblioteca de criptografia projetada para esse fim e de uma quantidade significativa de tempo para pesquisar os métodos necessários. Além disso, a criptografia de software é provavelmente <10% da segurança de dados confidenciais. É como reconectar uma usina nuclear - aceite que a tarefa é perigosa e difícil e além do seu conhecimento, se for o caso. As sanções financeiras podem ser imensas, por isso é melhor usar um serviço e enviar responsabilidade a eles.
3) Qualquer tipo de criptografia facilmente implementável, conforme listado aqui, pode proteger razoavelmente informações levemente importantes que você deseja evitar de olhares indiscretos ou limitar a exposição em caso de vazamento acidental / intencional. Mas, vendo como a chave é armazenada em texto sem formatação no servidor da Web, se eles podem obter os dados, podem obter a chave de descriptografia.
Seja como for, divirta-se :)
fonte
M�������f=�_=
caracteres estranhos como o criptografado. Não consigo obter caracteres simples? Como:2a2ffa8f13220befbe30819047e23b2c
. Além disso, não posso alterar o COMPRIMENTO de$key_value
(fixo em 8 ???) e o COMPRIMENTO de saída$encrypted_text
? (que não pode ser 32 ou 64 de comprimento ou o que mais ??)MCRYPT_RIJNDAEL_128
) e os textos cifrados devem ser autenticados (hash_hmac()
, verificados comhash_equals()
).Se você não quiser usar a biblioteca (o que deveria), use algo como isto (PHP 7):
fonte
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Estes são métodos compactos para criptografar / descriptografar seqüências de caracteres com PHP usando o AES256 CBC :
Uso:
fonte
Abaixo do código, trabalho em php para todas as strings com caracteres especiais
fonte