3

私は Java サーバーを持っています。フォーラムのユーザー詳細を使用してサーバーに接続したいと考えています。

しかし問題がある。

Xenforo を使用していますが、xenforo のアルゴリズムがよくわかりません。はい、分かった、それは

public static String encryptPassword(String password) {
 return sha1(sha1(password)+theSalt);
}

ソルトは xenforo の $salt ですが、チェックしたところ、Xenforo はユーザーごとに新しいソルトを生成します。これにより、サーバー側での実行がさらに難しくなり、それがどのように生成され、どのようにパスワードが暗号化されるかが実際にはわかりません、暗号化を見つける方法、間違っていなければ、xenforoには70を超えるクラスがあります。

Sha1(sha1 $password は正しく、salt は間違っています。

私はそれをあきらめて、ログインの詳細がWeb側で正しいかどうかを確認するphpファイルを作成しました(Xenforoの機能を使用)。

<?php
$startTime = microtime(true);
//FULL PATH.
require('/var/www/mydir/forums/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader('/var/www/mydir/forums/library');

XenForo_Application::initialize('/var/www/mydir/forums/library');
XenForo_Application::set('page_start_time', $startTime);

//Crypt code you set for your login, if you dont have it, then just comment $crypt out, but this is VERY useful agaisnt brute forces.
$crypt = $_POST['crypt'];

if (isset($_POST['username']) && isset($_POST['password']) && $crypt === 911895326) {

    //Username you're posting from server.
    $username = $_POST['username'];
    //Password you're posting from server.
    $password = $_POST['password'];

    $db = XenForo_Application::getDb();

    $data = $db->fetchOne('
    SELECT
    auth.data
    FROM xf_user_authenticate AS auth
    INNER JOIN xf_user AS user ON
    (user.user_id = auth.user_id)
    WHERE user.username = ?
    ', $username);

    //Gets the auth from Xenforo classes
    $auth = XenForo_Authentication_Abstract::createDefault();

    $auth->setData($data);

    //Checks if equal through the hash
    $check = $auth->authenticate($username, $password);

    //dump for testing (true/false)
    Zend_Debug::dump($check);

    /* CHECKING METHOD */ 

        //Checks if login details are equal to the ones that are in the database.
        if ($check) {
            //Prints "Success" string, so you can check in java if the printed string is that, if yes, then create login.
            echo 'Success';
        } else {
            echo 'Failed';
        }
    }

?>

Java サーバーは、GET メソッドを介して次のようなものを送信します。

http://yourwebsite.com/password.php?crypt=123456789&username=jony&password=1234567

次に、PHP は暗号が正しいかどうか、ユーザーが一致しているかどうか、パスワードが一致しているかどうかを確認します。

詳細が正しい場合、システムは「true」を出力します。そして、Javaサーバーから、そのページに「true」という名前の文字列があるかどうかを確認できます。はいの場合はログインを作成し、そうでない場合はエラーを出します。

一部の人々は、これは非常に安全ではないと私に言いました。wireshark プログラムを使用して URL をフェッチし、その URL を使用してパスワードをブルート フォースできます。

これは本当ですか?その方法は安全ではありませんか?

それ以外のオプション、またはデータベースからパスワードを直接一致させるオプションはありますか? または、この方法の改善点はありますか? :

public class letLogin {

    private static final string CRYPTION_ID = 'faCuGujuF32XaNeWr3t7';
    private static final String WEBSITE_DOMAIN = "http://yourwebsite.com/";

    public static int processUser(Client client){
        try {
            String URL = WEBSITE_DOMAIN + "loginProtocol.php?crypt=" + CRYPTION_ID + "&name="+client.playerName.toLowerCase().replace(" ","_")+"&pass="+client.playerPass;
            HttpURLConnection CONNECTION_HANDLE = (HttpURLConnection) new URL(URL).openConnection();
            BufferedReader OUTPUT_HANDLE = new BufferedReader(new InputStreamReader(CONNECTION_HANDLE.getInputStream()));
            String OUTPUT_DATA = OUTPUT_HANDLE.readLine().trim();
            try {
                if (!OUTPUT_DATA.contains("success"))
                    return 3;

            } catch(Exception e){
                System.out.println("Web server not responding for query: " +OUTPUT_DATA);
                return 8;               
            }
        } catch(Exception e2){ }
        return 2;
    }
}

ありがとう!

4

2 に答える 2

1

まず、変数を GET に渡すと変数を取得できませんが、POST で取得します。GET を使用すると安全ではありません。wireshark を使用する必要はありません。ブラウザの履歴を表示するだけでパスワードを知ることができます。XenForo はわかりませんが、私の好みは次のとおりです。ユーザー名と暗号化 pwd -> その pwd と db のハッシュをチェックします

于 2013-03-25T03:08:11.703 に答える
1

この方法は非常に安全ではありません。ただし、代わりに https を使用するように URL を変更すると、安全になり、そのようなプレーン テキストでパスワードを送信できます。

https://yourwebsite.com/password.php?crypt=123456789&username=jony&password=1234567

SSL を使用せずに (http 経由で) 送信する場合は、誰かが Wireshark を使用するときに、パスワードを総当たり攻撃する必要さえありません。それは彼らに見えるだけです。

HTTPS は安全です。情報源:

また、サーバー側のコードで $_POST を $_GET に変更する必要があります。

于 2013-03-25T03:02:43.963 に答える