SORU
17 Mayıs 2013, Cuma


Nasıl PHP bir Dize Şifresini çözmek için?

Demek istiyorum

Original String   Salt or Key --> Encrypted String
Encrypted String   Salt or Key --> Decrypted (Original String)

Belki bir şey gibi:

"hello world!"   "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
  • PHP, nasıl yaparsın bunu?

(Crypt_Blowfish ama benim için işe yaramadı kullanmayı denedi.)

CEVAP
11 Mayıs 2015, PAZARTESİ


Bir şey daha, 33**, ve muhtemelen neden istediğini anlamaya çalış önceşifreleme kimliği doğrulanmışsadece yerineşifreleme.

Kimliği doğrulanmış şifreleme uygulamak için, sonra MAC Şifrelemek istediğiniz. The order of encryption and authentication is very important! bu soru için mevcut cevapların Bir çoğu şifreleme kütüphaneleri PHP ile yazılmış gibi bu hatayı yaptı;.

35**, ve bunun yerine güvenli bir kütüphane tarafından yazılmış ve kriptoloji uzmanları tarafından yapılmıştır kullanmalısınız.

Use libsodium if you have PECL access; aksi halde...
Use defuse/php-encryption; rulo kendi şifreleme yok!

Kütüphaneler yukarıda yukarıda bağlantılı her ikisi de kolay ve acısız kendi kütüphaneleri içine doğrulanmış şifreleme uygulamak olun.

Eğer hala kendi şifreleme kütüphane, İnternet üzerindeki her şifreleme uzmanı geleneksel bilgelik karşı yazmak dağıtmak istiyorsanız, bu almak gerekir adımlar vardır.

Şifreleme:

  1. Yüzey düz metin doldurma aklı başında bir strateji (örneğin PKCS#7) kullanarak
  2. AES, BlowFish, Serpent, TwoFish veya Triple-DES kullanarak veya TO CBC modunda şifreleme. Ayrıca HGK ayrı bir MAC için olan ihtiyacı ortadan kaldırır) kullanabilirsiniz. Ayrıca, ChaCha20 ve Salsa20/8 (libsodium tarafından sağlanan) akış şifreleri ve özel modları gerekmez.
  3. HGK yukarıda seçtiğiniz sürece, HMAC-SHA-256 (veya, akış şifreleri, Poly1305 sizin için bunu yapmak API en libsodium için) ile şifreli metin kimlik doğrulaması gerekir.MAC IV olarak saydım kapsamalıdır!

Şifre çözme:

  1. Poly1305 veya HGK kullanılmadığı sürece, şifreli mesajı MAC yeniden ve hash_equals() kullanılarak gönderilen MAC ile karşılaştırın. Eğer başarısız olursa, iptal.
  2. İletinin şifresini çözmek.
  3. Dolgu çıkarın.

Diğer Tasarım Konuları:

  1. Bir şey sıkıştırır. Saydım sıkıştırılabilir değildir; şifreleme önce düz metin sıkıştırmak bilgi sızıntıları (örneğin SUÇ ve TLS İHLALİ) yol açabilir.
  2. mb_strlen() mb_substr(), '8bit' karakter kümesi kipini kullanarak mbstring.func_overload sorunları önlemek için kullandığınızdan emin olun.
  3. IVs mcrypt_create_iv() kullanıyorsanız kullanarak CSPRNG; üreten olmalıdırMCRYPT_RAND KULLANMAYIN!
  4. Bir AEAD inşa kullanarak değilsenizHer ZAMAN şifrelemek sonra MAC!
  5. bin2hex(), base64_encode(), vb. önbelleğe zamanlama ile şifreleme anahtarları hakkında bilgi sızdırıyor. Mümkünse onlardan uzak dur.

Eğer burada verilen tavsiyeler takip ederseniz bile, bir sürü şifreleme ile ters gidebilir.Her zaman şifreleme uzmanı uygulamanızı gözden geçirin.Eğer yerel Üniversitede bir öğrenci şifreleme ile kişisel arkadaş olmak için şanslı iseniz, her zaman tavsiye için Cryptography Stack Exchange forum deneyebilirsiniz.

Eğer uygulama profesyonel bir analiz gerekirse, her zaman reputable team of security consultants to review your PHP cryptography code bir kiralayabilirsiniz (açıklama: patronum).

Libsodium ile örnek

<?php
// This requires the libsodium PECL extension

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 */
function safeEncrypt($message, $key)
{
    $nonce = \Sodium\randombytes_buf(
        \Sodium\CRYPTO_SECRETBOX_NONCEBYTES
    );

    $cipher = base64_encode(
        $nonce.
        \Sodium\crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    \Sodium\memzero($message);
    \Sodium\memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 */
function safeDecrypt($encrypted, $key)
{   
    $decoded = base64_decode($encrypted);
    $nonce = mb_substr($decoded, 0, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');

    $plain = \Sodium\crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    \Sodium\memzero($ciphertext);
    \Sodium\memzero($key);
    return $plain;
}

O zaman bunu test etmek için:

<?php
// This refers to the previous code block.
require "safeCrypto.php"; 

// Do this once then store it somehow:
$key = \Sodium\randombytes_buf(
    \Sodium\CRYPTO_SECRETBOX_KEYBYTES
);
$message = 'We are all living in a yellow submarine';

$ciphertext = safeEncrypt($message, $key);
$plaintext = safeDecrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

Halit - Libsodium Kolaylaştırdı

Üzerinde çalıştığım projelerden biri bir şifreleme kütüphane libsodium daha kolay bir hale getirmeyi amaçlayan Halite denir.

<?php
use \ParagonIE\Halite\Key;
use \ParagonIE\Halite\Primitive\Symmetric;

// Generate a new random symmetric-key encryption key. You're going to want to store this:
$key = new Key::generate(Key::ENCRYPTION | Key::SECRET_KEY);
// Later, to restore the key object from a string, just pass it to the constructor:
// $key = new Key($string, false, false, false);

$message = 'We are all living in a yellow submarine';
$ciphertext = Symmetric::encrypt($message, $key);
$plaintext = Symmetric::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

Temel kriptografi tüm libsodium tarafından işlenir. Belli ki, bu Halit kullanmak için PECL uzantısı gerekir.

Etkisiz hale örnek/php-şifreleme

<?php
/**
 * This requires https://github.com/defuse/php-encryption
 * php composer.phar require defuse/php-encryption
 * 
 * Note that v2.0.0 is around the corner and this might need
 * to be edited when it's finally released.
 */

use \Defuse\Crypto\Crypto;

require "vendor/autoload.php";

// Do this once then store it somehow:
$key = Crypto::createNewRandomKey();

$message = 'We are all living in a yellow submarine';

$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);

var_dump($ciphertext);
var_dump($plaintext);

Not: Crypto::encrypt() depolama/ciphertexts kodlama hataları önlemek için aktarma base64_encode() base64_decode()kullanmak isteyebilirsiniz böylece ham ikili döner.

Şifreleme Anahtar Yönetimi

Eğer kullanmak için cazip konum "", hemen dur. şifre 128-bit şifreleme anahtarı, insan unutulmaz bir parola rasgele değil.

Uzun süreli kullanım gibi bir şifreleme anahtarı kaydedebilirsiniz:

$storeMe = bin2hex($key);

Ve, talep üzerine, öyle gibi alabilirsiniz:

$key = hex2bin($storeMe);

Bengüçlüsadece şifre herhangi bir yerine uzun süreli kullanım için rasgele oluşturulmuş bir anahtar saklamak anahtar olarak (veya anahtarı türetmek için) tavsiye ederim.

"Ama Bengerçektenbir parola kullanmak istiyorum."

Bu kötü bir fikir, ama Tamam, burada güvenli bir şekilde yapmak için nasıl.

Öncelikle, rasgele bir anahtar oluşturmak ve saklamak için bir sabit.

/**
 * Replace this with your own salt! 
 * Use bin2hex() then add \x before every 2 hex characters, like so:
 */
define('MY_PBKDF2_SALT', "\x2d\xb7\x68\x1a\x28\x15\xbe\x06\x33\xa0\x7e\x0e\x8f\x79\xd5\xdf");

Ek iş ekleme ve sadece bu sabiti kullanabilirsiniz anahtarı olduğunu unutmayın ve kendinizi gönül yarası bir çok kaydedebilirsiniz!

Sonra PBKDF2 (bunun gibi) uygun bir şifreleme parola ile doğrudan şifreleme yerine şifre anahtarı türetmek için kullanılır.

/**
 * Get an AES key from a static password and a secret salt
 * 
 * @param string $password Your weak password here
 * @param int $keysize Number of bytes in encryption key
 */
function getKeyFromPassword($password, $keysize = 16)
{
    return hash_pbkdf2(
        'sha256',
        $password,
        MY_PBKDF2_SALT,
        100000, // Number of iterations
        $keysize,
        true
    );
}

Yok sadece 16 karakterli bir şifre. Şifreleme anahtarı gülünç kırılmış olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • Numberphile

    Numberphile

    15 EYLÜL 2011