3

我有一个 java 服务器,我想使用论坛的用户详细信息连接到我的服务器。

但有一个问题。

我正在使用 Xenforo,但我真的不知道 xenforo 的算法。是的,我想通了,它是

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

盐在 xenforo 中是 $salt,但我已经检查过,Xenforo 为每个用户生成一个新盐。这使得在服务器端做起来更加困难,我真的找不到它是如何生成它的,它是如何加密密码的,它是如何发现加密的,如果我没记错的话,xenforo 有 70 多个课程。

sha1(sha1 $password 是对的,salt 是错的。

我放弃了它,并制作了一个 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,但我的偏好是:sha1原始密码->发布用户名和加密密码 -> 使用该密码和 db 中的密码检查哈希

于 2013-03-25T03:08:11.703 回答
1

这种方法非常不安全。但是,如果您将 URL 更改为使用 https,它将是安全的,您可以像这样通过纯文本发送密码。

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

如果您保持原样并在没有 SSL(通过 http)的情况下发送它,当有人使用wireshark 时,他们甚至不必强行输入密码。他们只会看到它。

HTTPS 是安全的,来源:

您还需要在服务器端代码上将 $_POST 更改为 $_GET。

于 2013-03-25T03:02:43.963 回答