我有一个java服务器, 我想使用论坛的用户详细信息连接到我的服务器。
但是有一个问题。
我正在使用Xenforo,我真的不知道xenforo的算法。 是的,我想通了,这是
public static String encryptPassword(String password) {
return sha1(sha1(password)+theSalt);
}
盐是xenforo中的盐,但是我已经检查过,Xenforo会为每个用户生成一个新的盐...这使得服务器端和服务器更加困难。我无法真正找到它如何生成它,如何加密密码,如何找到加密,如果我没有错,xenforo有超过70个类。
Sha1(sha1 $密码是对的,盐是错的。
我放弃了它,并制作了一个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,然后使用该网址强制使用密码。
这是真的吗? 那种方法不安全吗?
除此之外还有其他选择,还是直接匹配数据库中的密码? 或者对这种方法有什么改进? :
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;
}
}
谢谢!
答案 0 :(得分:1)
这种方法非常不安全。但是,如果您将URL更改为使用https,那么它将是安全的,您可以通过纯文本发送密码。
https://yourwebsite.com/password.php?crypt=123456789&username=jony&password=1234567
如果保持原样并且没有SSL(通过http)发送,当有人使用wireshark时,他们甚至不必暴力破解密码。它只会被他们看到。
HTTPS是安全的,来源:
您还需要在服务器端代码上将$ _POST更改为$ _GET。
答案 1 :(得分:1)
首先,当你传递变量时,你不会得到变量 GET但是你在POST中得到它们。 如果使用GET是不安全的,我不需要使用wireshark,只需查看您的浏览器历史记录即可知道您的密码.... 我不知道XenForo,但我的偏好是: sha1原始密码 - &gt;发布用户名和加密密码 - &gt;检查该pwd的哈希值和db
中的哈希值