私は 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;
}
}
ありがとう!