5

ウェブサイトを構築しており、支払い方法は Google Checkout と Paypal になります。支払いを処理するための安全な Google/Paypal サイトにユーザーをリダイレクトするリンク/ボタンがあります。これは、サイトに SSL 証明書をインストールするための年間 150 ドルの追加費用と複雑さが必要ないことを意味します。

ただし、ユーザーがログインしているときにユーザーのパスワードを暗号化したいので、ネットワーク上にいる場合、FireSheep などを実行している悪意のある人物がサーバーに送信されているユーザーの実際のパスワードを読み取ることができません。サイトの残りの部分は、機密データではなく、おそらくユーザー エクスペリエンスが大幅に低下するため、暗号化は必要ありません。

私の考えでは、これは公開鍵暗号で実装できると思います。プロセスが次のようになるとしましょう。

  1. 公開鍵は JavaScript 外部ファイルにあり、秘密鍵はサーバー上の PHP にあります
  2. ユーザーはフォームにユーザー名とパスワードを入力し、送信をクリックします
  3. JavaScript が実行されてパスワードが暗号化され、テキスト フィールドに保存されます。
  4. フォームがサーバーに送信され、パスワードが PHP で復号化されます
  5. PHP のプレーン テキスト パスワードはソルト化およびハッシュ化され、データベース内のハッシュと比較されます。
  6. 登録/パスワード変更機能についても同様のプロセスが考えられます。

RSAのようなものがうまくいくと思います。しかし、それを行うために動作する JavaScript ライブラリをネットで探しましたが、利用可能な PHP ライブラリと互換性があるものはないようです。いずれにしても、JavaScript および PHP と互換性のある一連のキーを生成する必要があります。

これに対する実際の実用的な解決策を知っている人はいますか? そうでない場合は、作成してからオープンソースにしましょう。残念ながら、暗号化/復号化コードの記述は非常に複雑であるため、既存のライブラリが何を行っているのか、それらを変更して機能させる方法を正確には知りません。私はすでにセッション固定/ハイジャックに対する保護を持っているので、それには興味がありません。Webサーバーに到達する前にデータを暗号化することに興味があります.

注: スタンドアローンの Javascript または PHP 暗号化ライブラリへのリンクを大量に投稿しないでください。既に Google でそれらを見つけました。それは実際には役に立ちません。私が必要としているのは、JavaScript 暗号化と PHP 復号化のコードであり、実際に調和して連携して、上記で概説した意図した結果を生成します。

また、「SSL を使用するだけ」などのコメントの投稿を控えていただければ幸いです。ベストプラクティスでなくても、この正確な問題の解決策が実際に欲しいのですが、それでも興味深いでしょう。

どうもありがとう!

4

6 に答える 6

18

1 つだけ問題があります。攻撃者は実際のパスワードを知る必要はありません。彼が確認する必要があるのは、サーバーに送信される値だけです。この値により、ユーザーはログインできます。値が何であるかは重要ではありません。平文でも、暗号化されたテキストでも、猫の写真でも。これは、ユーザーを認証する単なるトークンです。攻撃者がこのトークンを見て同じ要求を繰り返すことができ、その同じ要求によって攻撃者がログインできるようになった場合、何も得られません。

于 2011-04-20T01:45:36.157 に答える
7

RSA は過剰です。おそらく必要なのは、単純なチャレンジ/レスポンス プロトコルです。例えば:

  • ランダムな nonce 値を生成します。これにより、リプレイ攻撃を防ぐことができます。
  • そのノンス値とパスワード ソルトを、残りのログイン フォームとともにブラウザに送信します。
    • パスワードをソルト化およびハッシュ化された形式で保存していますよね?
  • ユーザーがパスワードを入力すると、代わりに計算フォームのスクリプトがハッシュ (ハッシュ (パスワード、ソルト)、ナンス) を送り返します。
  • サーバーがフォームの送信を受信したら、サーバーに hash(storedSaltedPassword, nonce) を計算させ、送信された値と等しいことを確認します。
    • サーバーで nonce 値を保持します。クライアントがそれをあなたにエコーバックすることを信頼しないでください。そうしないと、リプレイ保護がなくなります。

この方式の弱点は、データベース内のパスワード ハッシュが、ある意味ではパスワードと同等であることです。これらのハッシュを生成するために使用された元のパスワードを抽出することはおそらく不可能ですが、保存されたハッシュの知識は、サイトでユーザーになりすますのに十分です.

SSL 証明書はまったく異なる目的を果たします。SSL 証明書の目的は、サードパーティの不正なサーバーがあなたのサーバーであると主張するのを困難にすることです。あなたのドメインに属しています。一方、悪意のあるサーバーがあなたのサーバーになりすますのを止めることができない場合、ユーザーが自分のパスワードをその悪意のあるサーバーに提供するのを防ぐことはできません。

于 2011-04-20T01:48:50.213 に答える
3

まず、これは良い考えではないと思います。あなたに役立つかもしれないGoogleを使用したいくつかの例を見つけました(ただし、これらはテストしていません):

GPL JavaScript 公開鍵暗号化

JavaScript での RSA 公開鍵暗号化テスト

JavaScript での PGP 暗号化

JavaScript での RSA アルゴリズムの例

暗号化されたすべての値をソルトするための何らかのソルティング メカニズムを確立する必要があります。そうしないと、キーが危険にさらされる可能性があります。

于 2011-04-20T01:43:18.143 に答える
2

http://www.jcryption.org/ -- 探している組み合わせです。

于 2011-08-11T09:35:39.593 に答える
1

パスワードを暗号化する必要はありません。パスワードをハッシュする必要があります。プレーンテキストのパスワードに自分でアクセスしたくはありません。そうしないと、否認防止が失われ、重大な法的結果が生じます。続行する前に、この意味を徹底的に調査する必要があります。

于 2011-04-20T12:24:19.187 に答える
0

これは、入力を受け取り、コンテンツを Java スクリプトで暗号化するためのコードです。コード全体は github でも入手できます。encrypt_js_decrypt_php で検索できます。問題は長い間実行されていました.私は解決策を思いつきました.それをローカルホストにインポートするだけです.

<html>

<input type="text" id="code" name="code"/>
<input type="submit" name="submit" value="submit" onclick="return encryptCode();"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
function rc4(key, str)
{
    var s = [], j = 0, x, res = '';
    for (var i = 0; i < 256; i++) 
    {
        s[i] = i;
    }
    for (i = 0; i < 256; i++) 
    {
        j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
    }
    i = 0;
    j = 0;
    for (var y = 0; y < str.length; y++) 
    {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
        res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
    }
    return res;
}

function encryptCode()
{
  var value = document.getElementById("code").value;
  var key = "secretKeyToProvide";  /*--Provide Your secret key here--*/
  var codeValue = rc4(key, value);
  var arr = {code:codeValue, Age:25};
  $.ajax({
                url: "response.php",
                type: "POST",
                data: JSON.stringify(arr),
                dataType: 'json',
                async: false,
                contentType: 'application/json; charset=utf-8',
                success: function(data) 
                {
                    alert(data);
                }
            });   
}
</script>
</html>

それでは、phpでコードを解読しましょう

<?php

function mb_chr($char) 
{
    return mb_convert_encoding('&#'.intval($char).';', 'UTF-8', 'HTML-ENTITIES');
}

function mb_ord($char)
{
    $result = unpack('N', mb_convert_encoding($char, 'UCS-4BE', 'UTF-8'));
    if (is_array($result) === true) 
    {
        return $result[1];
    }
        return ord($char);
}

function rc4($key, $str) 
{   
    if (extension_loaded('mbstring') === true) 
    {
        mb_language('Neutral');
        mb_internal_encoding('UTF-8');
        mb_detect_order(array('UTF-8', 'ISO-8859-15', 'ISO-8859-1', 'ASCII'));
    }
    $s = array();
    for ($i = 0; $i < 256; $i++)
    {
        $s[$i] = $i;
    }
    $j = 0;
    for ($i = 0; $i < 256; $i++)
    {
        $j = ($j + $s[$i] + mb_ord(mb_substr($key, $i % mb_strlen($key), 1))) % 256;
        $x = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $x;
    }
    $i = 0;
    $j = 0;
    $res = '';
    for ($y = 0; $y < mb_strlen($str); $y++)
    {
        $i = ($i + 1) % 256;
        $j = ($j + $s[$i]) % 256;
        $x = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $x;
        $res .= mb_chr(mb_ord(mb_substr($str, $y, 1)) ^ $s[($s[$i] + $s[$j]) % 256]);
    }
    return $res;
}

$request_body = file_get_contents('php://input');
$json = json_decode($request_body);
$secretCode =$json->code ;
$age =$json->Age  ;
$key = "secretKeyToProvide";  /*--Provide Your secret key here what you have given in javascript--*/
$decryptedSecretCode  = rc4($key, $secretCode) ;
echo $decryptedSecretCode;
exit;
?>
于 2015-07-15T07:29:04.577 に答える