26

.txtファイルをzipに暗号化する方法を探していますが、安全なパスワードで保護された方法で。私の目標は、添付ファイルの内容を誰も読めないように、このファイルを私に電子メールで送信することです。

誰かがこれを達成するための簡単で何よりも安全な方法を知っていますか?zipアーカイブを作成することはできますが、暗号化する方法や、これがどれほど安全かわかりません。

4

5 に答える 5

20

注:この回答では、パスワードが適切であっても、安全でないことがわかっている暗号化方式を推奨しています。コメントからのリンクAESのWinzipQAを参照してください。in- php AESzip暗号化のサポートはphp7.2 (およびlibzip 1.2.0)で提供されます。これは、この回答もまもなく古くなることを意味します。それまでは、winzipのAES暗号化をサポートするzipコマンドの代わりに7zを呼び出す方法について、この回答を参照してください

あなたはこれを使うことができます:

<?php echo system('zip -P pass file.zip file.txt'); ?>

ここで、passはパスワードであり、file.txtはfile.zipに圧縮されます。これはWindowsとLinuxで機能するはずです。Windows用の無料バージョンのzipを入手する必要があります(http://www.info-zip.org/Zip.html#Win32

この種のセキュリティは、ブルートフォース攻撃や辞書攻撃などによって破られる可能性があります。しかし、特に長くて推測しにくいパスワードを選択した場合は、それほど簡単ではありません。

于 2009-03-14T16:45:17.007 に答える
0

AES で暗号化された ZIP ファイルをサポートするツールがますます増えています。それは機能します、それは安全です。

EDIT2: PHP からDotNetZipを使用して、PHP から AES で暗号化された zip アーカイブを動的に生成できます。DotNetZip は、.NET 言語 (C#、VB など) 用に設計された .NET ライブラリです。これは Windows でのみ動作します :(。しかし、DotNetZip は AES を実行し、無料で、PHP から動作します。

これは私が使用したコードです。(Win32 上の PHP v5.2.9)

<?php
try
{
  $fname = "zip-generated-from-php-" . date('Y-m-d-His') . ".zip";
  $zipOutput = "c:\\temp\\" . $fname;
  $zipfact = new COM("Ionic.Zip.ZipFile");
  $zip->Name = $zipOutput;
  $dirToZip= "c:\\temp\\psh";
  # Encryption:  3 => 256-bit AES.  
  #     2 => 128-bit AES.  
  #     1 => PKZIP (Weak).  
  #     0 => None
  $zip->Encryption = 3;
  $zip->Password = "AES-Encryption-Is-Secure";
  $zip->AddDirectory($dirToZip);
  $zip->Save();
  $zip->Dispose();

  if (file_exists($zipOutput))
  {
    header('Cache-Control: no-cache, must-revalidate');
    header('Content-Type: application/x-zip'); 
    header('Content-Disposition: attachment; filename=' . $fname);
    header('Content-Length: ' . filesize($zipOutput));
    readfile($zipOutput);
    unlink($zipOutput);
  }
  else 
  {
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '</body>';
    echo '</html>';
  } 
}
catch (Exception $e) 
{
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '<p>Caught exception: ',  $e->getMessage(), '</p>', "\n";
    echo '<pre>';
    echo $e->getTraceAsString(), "\n";
    echo '</pre>';
    echo '</body>';
    echo '</html>';
}

?>

PHP で動作するように DotNetZip を変更する必要がありました。Name プロパティを読み取り/書き込み可能にし、COM 呼び出し可能にする必要がありました。この変更は、v1.8.2.3 リリースで初めて利用可能になりました。

于 2009-03-22T10:17:02.397 に答える
-4

これが私がやった方法です。エクセルですが、同じです。

  • php にランダムなコードネームを作成させます。
  • コードネームを db に保存するか、retrieve.php に含めるファイルに保存します。
  • コードネームを自分宛てに郵送してください。

  • ウェブ経由で retrieve.php?codename=[codename] にアクセス

  • コードネームが正しいかどうかをphpにチェックさせます。(たぶんそれは年齢です)。
  • 送信する必要があるデータから、メモリ内に Excel/テキスト ファイルを作成します。
  • コードネームでローカルパスワード(あなただけが知っている)を追加して、暗号化コードを作成します。
  • 作成した暗号化コードでオンザフライで暗号化します。
  • データベースまたは構成ファイルからコードネームを削除します。
  • この暗号化された文書をメールで返送します (圧縮するかサイズを圧縮しないでください)。
  • メールのコードネームの最初の 2 文字を追加して、使用するローカルの完全なコードネームを知ることができます。

  • ダウンロードしたファイルをデコードするには、ローカルの復号化スクリプトを使用します。同じコードネーム/パスワード アルゴリズムを使用して、復号化キーを作成します。

私は gibberish-aes-php を使用しています。( https://github.com/ivantcholakov/gibberish-aes-php )
その後、クライアントデコーダーでhttps://github.com/mdp/gibberish-aesを JavaScript として使用できるため (簡単に説明したい場合)ブラウザでご覧ください)。

于 2014-01-01T21:53:51.587 に答える