Лучший способ использовать PHP для шифрования и расшифровки паролей? [дубликат]




Возможные Дубликаты:
PHP 2-way encryption: мне нужно хранить пароли, которые могут быть получены






Я планирую хранить иностранных учетной информации для моих пользователей на моем сайте, он же рапидшарой логин и пароли и т. д... Я хочу сохранить информацию в безопасности, но я знаю, что если я хэширую их информацию, я не могу получить ее для последующего использования.



Base64 расшифровывается, поэтому нет смысла использовать это просто.
Моя идея такова чтобы скремблировать пользователя и пройти до и после того, как он получит base64ed таким образом, даже после его расшифровки, вы получите какой-то забавный текст, если попытаетесь расшифровать. Есть ли функция php, которая принимает значения, которые сделают уникальный скремблирование строки и де-скремблировать его позже, когда значение повторно вводится?



какие предложения?

566   8  

8 ответов:

вы не должны шифровать пароли, вместо этого вы должны хэшировать их с помощью алгоритма, как bcrypt. этот ответ объясняет, как правильно реализовать хэширование паролей в PHP. тем не менее, вот как вы бы шифровать/расшифровывать:

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

Шифровать:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

Расшифровать:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    ""
);

предупреждение: приведенный выше пример шифрует информацию, но она не аутентифицируется зашифрованный текст для предотвращения подделки. вы должны не полагайтесь на несанкционированное шифрование для обеспечения безопасности, тем более что предоставленный код уязвим к атакам oracle padding.

посмотреть также:

кроме того, не просто использовать "пароль" для получения ключа шифрования. ключи шифрования-это случайные строки.


демо на 3v4l.org:

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "

Предупреждение: этот класс не является безопасной. Он использует Rijndael256-ЕЦБ, что не является семантически безопасным. Просто потому, что "это работает" не означает "это безопасно". Кроме того, он лишает хвостовые пространства впоследствии из-за не использования надлежащего заполнения.

нашел этот класс недавно, он работает как сон!

class Encryption {
    var $skey = "yourSecretKey"; // you can change it

    public  function safe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }

    public function safe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    public  function encode($value){ 
        if(!$value){return false;}
        $text = $value;
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
        return trim($this->safe_b64encode($crypttext)); 
    }

    public function decode($value){
        if(!$value){return false;}
        $crypttext = $this->safe_b64decode($value); 
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
        return trim($decrypttext);
    }
}

и назвать его:

$str = "My secret String";

$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);    

echo "$encoded<p>$decoded";

предупреждение: этот код не является безопасным.

пример

define('SALT', 'whateveryouwant'); 

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

$encryptedmessage = encrypt("your message"); 
echo decrypt($encryptedmessage); 

одна вещь, которую вы должны быть очень осведомлены при работе с шифрованием:

пытаясь быть умным и изобретать свою собственную вещь, как правило, оставит вас с чем-то небезопасным.

вам, вероятно, лучше всего использовать один из криптография расширения которые поставляются с PHP.

Securiy Предупреждение: этот код неуверенность. В дополнение к тому, что он уязвим для атак выбранного шифрованного текста, его зависимость от unserialize() делает его уязвимым для инъекции объекта PHP.

для обработки строки / массива я использую эти две функции:

function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
 return $s;
}

function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), ""));
 return $s;
}

Это гибкий, как в вы можете хранить / отправлять через URL строку или массив, потому что строка/массив сериализуется перед шифрованием.

Это даст вам только предельную защиту. Если злоумышленник может запустить произвольный код в вашем приложении, они могут получить пароли точно так же, как и ваше приложение. Вы все еще можете получить некоторую защиту от некоторых атак SQL-инъекций и неуместных резервных копий БД, если вы храните секретный ключ в файле и используете его для шифрования на пути к БД и расшифровки на выходе. Но вы должны использовать bindparams, чтобы полностью избежать проблемы SQL-инъекции.

Если решите для шифрования вы должны использовать некоторую криптографическую библиотеку высокого уровня для этого, или вы будет сделать это неправильно. Вам нужно будет правильно настроить ключ, заполнить сообщение и проверить целостность, или все ваши усилия по шифрованию мало полезны. GPGME хороший выбор для одного примера. Mcrypt-это слишком низкий уровень, и вы, вероятно, ошибетесь.

Проверьте mycrypt ():http://us.php.net/manual/en/book.mcrypt.php

и если вы используете postgres есть pgcrypto для шифрования уровня базы данных. (облегчает поиск и сортировку)

лучшая идея для шифрования / расшифровки данных в базе данных, даже если у вас есть доступ к коду, чтобы использовать 2 разных проходит личный пароль (user-pass) для каждого пользователя и личный код для всех пользователей (system-pass).

сценарий

  1. user-pass хранится в MD5 в базе данных и используется для проверки каждого пользователя для входа в систему. Этот пропуск пользователя разные для каждого пользователя.
  2. каждая запись пользователя в базе данных есть в md5 a system-pass для шифрования / расшифровки данных. Эта система-pass является то же самое для каждого пользователя.
  3. каждый раз, когда пользователь удаляется из системы, все данные, зашифрованные в старой системе, должны быть зашифрованы снова в новой системе, чтобы избежать проблем с безопасностью.

Comments

    Ничего не найдено.