2016-05-15 11 views
-1

ウェブアプリケーションを作成していて、いくつかの用途で文字列を暗号化してから解読する必要があり、コードからのすべてがMacBookのlocalhost 10.11.4とXAMPP 5.6.15-1しかし、私はサーバー上でコードをアップロードするとき、それはちょうどうまく動作しません。 1つの問題が見つかりました(複数のサーバーで試しました)。サーバ上でPHP暗号化が機能しない "mcrypt_get_iv_size"関数

だから、これは私のコードです:

<?php 
session_start(); 
header("Content-Type: text/html;charset=UTF-8"); 
if (isset($_POST["file"])) { 
    $filename = $_POST["file"]; 
    //$filename = $_GET["file"]; 
    $filename = substr($filename, 12); 

    $username = $_SESSION["username"]; 
    $key = $_SESSION["key"]; 

    $filename = "../users/$username/text/" . $filename; 

    $fileNumber = $_POST["number"]; 

    ///Cloude/users/antonio/text/teext/file2.txt 
    // Cloude/script 

    $handle = fopen($filename, "r"); 
    $contents = fread($handle, filesize($filename)); 
    fclose($handle); 
echo $contents; 
    $decrypt = str_replace(" ", "+", $contents); 

echo " ------ 1 ------ "; 

    $decrypt = explode('|', $decrypt.'|'); 
    $decoded = base64_decode($decrypt[0]); 
    $iv = base64_decode($decrypt[1]); 

echo " ------ 2 ------"; 

    if(strlen($iv)!==mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)){ return false; } 

echo " ------ 3 ------"; 

    $key = pack('H*', $key); 
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $decoded, MCRYPT_MODE_CBC, $iv)); 
    $mac = substr($decrypted, -64); 
    $decrypted = substr($decrypted, 0, -64); 
    $calcmac = hash_hmac('sha256', $decrypted, substr(bin2hex($key), -32)); 
    if($calcmac!==$mac){ return false; } 
    $decrypted = unserialize($decrypted); 

    echo json_encode($decrypted . "qJB0rGtIn5UB1xG03efyCp55"); 
} 

と、このエコーはちょうどラインが動作しませんテストのためです。だから私はそれをすべて実行しようとすると、それは単に "------ 1 ------と------ 2 ------"をコードし、

の後のコード
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC) 

ちょうどサーバで動作しませんが、誰もがなぜ知っていますか?

編集:私はバグを発見した、それはホスティングの問題だった、彼らは奇妙なことをやって、とにかくおかげで!

+1

エラーチェックで*何?* –

+0

ありがとうございます。問題は、私が000webhost.comで無料ホスティングを使用していたことでした。彼らは解析を追跡するスクリプトを.htmlファイルに追加しました。ファイルを読むときにそのスクリプトコードを削除してください、とにかく、ありがとうとにかく –

+0

それが解決されたことを嬉しく思います。 –

答えて

2

MCrypt関数を使用しないでください。どうして? MCryptは放棄されたとみなされるのでです。ライブラリーはもはや積極的に維持されておらず、長い時間以来、a long list of known bugsは修正されていません。

あなたの問題に対する解決策は何ですか? drop in libraryを使用するのが、迅速かつ簡単で安全なオプションです。簡単に強力な暗号化を行うための

例:

// Assuming a PSR-4 compatible autoloader 

use Driftwood\SymmetricEncryption; 
$password = 'correct horse battery staple'; 

$crypto = new SymmetricEncryption(20); 

$encrypted = $crypto->encrypt('Never roll your own crypto.', $password); 
$decrypted = $crypto->decrypt($encrypted, $password); 

echo $decrypted; // Never roll your own crypto. 



をあなたはreaallyその後、推奨されるソリューションは、PHPのOpenSSL extensionを使用することです(あなたはいけない)独自の暗号化ライブラリを作成したい場合。 しかし、暗号は非常に難しく、非常に難しいです。優れた暗号ラッパーを使用するには、複数の暗号学者とPHP専門家が協力し合ってお互いをチェックし、コードの各変更をダブルチェックする必要があります。あらゆる決定を精査する。

+1

私が見る* Pixelfck/SymmetricEncryption *の問題は、ドキュメントの欠如です。暗号化プリミティブはどのような暗号プリミティブをサポートしていますか(暗号化のみ)、暗号化認証を提供するのか、データフォーマット(コードを読むのか)は相互運用性のために必要です。必要なものの例として、RNCryptorは[データフォーマット仕様](https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3)を提供しています。md) – zaph

+0

@zaph、ええ、ドキュメントを増やすために問題を開くべきだと思います。彼らは認証された暗号化(Encrypt-then-mac)だとはっきりしていますが、[第3の箇条書き]です。私はそれ以外は絶対に勧めません。私は(app-sec)同僚(コード作成者ではありません)とコードを分析しました。このコードは文書化されており、高品質であることがわかりました。しかし、コードコメントはもちろん、適切な文書の代用ではありません。 – Jacco

+0

また、[defuse/php-encryption](https://github.com/defuse/php-encryption/blob/master/docs/CryptoDetails.md)については十分に文書化されており、昨日バージョン2が出ました。 –

関連する問題