Qual é a maneira mais simples de fazer criptografia bidirecional em instalações PHP comuns?
Eu preciso ser capaz de criptografar dados com uma chave de cadeia e usar a mesma chave para descriptografar na outra extremidade.
A segurança não é uma preocupação tão grande quanto a portabilidade do código, então eu gostaria de poder manter as coisas o mais simples possível. Atualmente, estou usando uma implementação RC4, mas, se encontrar algo com suporte nativo, acho que posso economizar muito código desnecessário.
php
security
encryption
cryptography
encryption-symmetric
user1206970
fonte
fonte
Sodium::crypto_secretbox()
eSodium::crypto_secretbox_open()
são seguros e com bom desempenho.Respostas:
Editado:
Você realmente deveria estar usando openssl_encrypt () & openssl_decrypt ()
Como Scott diz, o Mcrypt não é uma boa ideia, pois não é atualizado desde 2007.
Existe até um RFC para remover o Mcrypt do PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
fonte
Importante : A menos que você tenha um caso de uso muito específico, não criptografe senhas , use um algoritmo de hash de senha. Quando alguém diz que criptografa suas senhas em um aplicativo do servidor, elas não são informadas ou estão descrevendo um design de sistema perigoso. Armazenar senhas com segurança é um problema totalmente separado da criptografia.
Ser informado. Projete sistemas seguros.
Criptografia de dados portátil em PHP
Se você estiver usando o PHP 5.4 ou mais recente e não quiser escrever um módulo de criptografia, recomendo usar uma biblioteca existente que forneça criptografia autenticada . A biblioteca que vinculei depende apenas do que o PHP fornece e está sendo revisada periodicamente por um punhado de pesquisadores de segurança. (Eu mesmo incluído.)
Se seus objetivos de portabilidade não impedirem a necessidade de extensões PECL, libsodium é altamente recomendado sobre qualquer coisa que você ou eu possamos escrever em PHP.
Atualização (12/06/2016): agora você pode usar sodium_compat e usar as mesmas ofertas de cripto libsodium sem instalar extensões PECL.
Se você quiser experimentar a engenharia de criptografia, continue lendo.
Primeiro, você deve reservar um tempo para aprender os perigos da criptografia não autenticada e o Princípio da Perdição Criptográfica .
Criptografia e descriptografia
A criptografia no PHP é realmente simples (vamos usar
openssl_encrypt()
eopenssl_decrypt()
depois de tomar algumas decisões sobre como criptografar suas informações. Consulteopenssl_get_cipher_methods()
uma lista dos métodos suportados no seu sistema. A melhor opção é AES no modo CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
Atualmente, não há razão para acreditar que o tamanho da chave AES seja um problema significativo com o qual se preocupar (maior provavelmente não é melhor, devido ao mau agendamento de teclas no modo de 256 bits).
Nota: Não estamos usando
mcrypt
porque é um abandonware e possui bugs não corrigidos que podem afetar a segurança. Por esses motivos, incentivo outros desenvolvedores de PHP a evitá-lo também.Wrapper de criptografia / descriptografia simples usando OpenSSL
Exemplo de uso
Demonstração : https://3v4l.org/jl7qR
A biblioteca de criptografia simples acima ainda não é segura de usar. Precisamos autenticar textos cifrados e verificá-los antes de decifrar .
Nota : Por padrão,
UnsafeCrypto::encrypt()
retornará uma sequência binária bruta. Chame assim se precisar armazená-lo em um formato binário seguro (codificado em base64):Demo : http://3v4l.org/f5K93
Wrapper de autenticação simples
Exemplo de uso
Demonstrações : binário bruto , codificado em base64
Se alguém desejar usar esta
SaferCrypto
biblioteca em um ambiente de produção ou sua própria implementação dos mesmos conceitos, recomendo que você entre em contato com os criptografadores residentes para obter uma segunda opinião antes de você. Eles poderão falar sobre erros dos quais talvez eu nem saiba.Você ficará muito melhor usando uma biblioteca de criptografia respeitável .
fonte
Use
mcrypt_encrypt()
emcrypt_decrypt()
com os parâmetros correspondentes. Realmente fácil e direto, e você usa um pacote de criptografia testado em batalha.EDITAR
5 anos e 4 meses após esta resposta, a
mcrypt
extensão está agora em processo de descontinuação e eventual remoção do PHP.fonte
O PHP 7.2 se afastou completamente
Mcrypt
e a criptografia agora é baseada naLibsodium
biblioteca de manutenção .Todas as suas necessidades de criptografia podem ser basicamente resolvidas através da
Libsodium
biblioteca.Documentação do Libsodium: https://github.com/paragonie/pecl-libsodium-doc
fonte
crypto_sign
API não criptografa mensagens - isso exigirá uma dascrypto_aead_*_encrypt
funções.IMPORTANTE, esta resposta é válida apenas para o PHP 5, no PHP 7 use funções criptográficas embutidas.
Aqui está uma implementação simples, mas segura o suficiente:
Código e exemplos estão aqui: https://stackoverflow.com/a/19445173/1387163
fonte