0

我的客户有一个旧的 TYPO3 6.2 安装,它已在 TYPO3 8.7 中重建。

在旧的 TYPO3 6.2 安装中,该fe_users表拥有大约 15.000 个使用 MD5/crypt(3) 加密密码(以$1$开头)的用户。TYPO3 8.7 中客户端的重建fe_users现在具有基于新 crypt 的密码(以$pbkdf2-sha256$ 开头)。到现在为止还挺好。

旧的 TYPO3 6.2fe_users将被导入到新数据库中,但我在使用我们自己的 REST API(在 TYPO3 8.7 中构建)登录时遇到问题,其中使用的登录felogin都是成功的。成功登录后felogin,密码将转换为新加密,我可以使用 REST API 登录。-- 在使用 REST API 之前登录 15.000felogin个用户绝对不是一种选择:)

REST API 使用\TYPO3\CMS\Saltedpasswords\.

tl;dr: 如何在\TYPO3\CMS\Saltedpasswords\不首先强制他们使用的情况下检查成功的加密felogin

REST API 示例代码

下面代码中的$byPasswordDecrypt是密码的解密值,使用RNCryptor加密发送

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users');
    $queryRows = $queryBuilder
            ->select('uid', 'username', 'password')
            ->from('fe_users')
            ->where(
                    $queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter($ogUser))
            )
            ->execute();

    // Fetch the rows
    $queryFetch = $user = $queryRows->fetch();

    // Now, check the salted-password from the database against the given password
    if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) {
        $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword);
        if (is_object($objSalt)) {
            $success = $objSalt->checkPassword($byPasswordDecrypt, $queryFetch['password']);
        }
    }

如果有人能指出我成功进行密码哈希检查的正确方向,那将非常棒,我将非常感激!

4

1 回答 1

0

我自己设法解决了这个问题,并将解决方案发布到我自己的问题中,希望能帮助其他人解决这个问题。

TYPO3 6.2(可能更低)使用 MD5 散列对密码进行散列,从$1$开始。如果一切设置正确,TYPO3 8.7 将使用$pbkdf2-sha256$ 之类的东西对密码进行哈希处理。

要检查旧密码,您应该创建一个 TYPO3\CMS\Saltedpasswords\Salt\Md5Salt. 在您使用checkPassword此实例成功完成检查后,我建议您使用给定的密码更新您的数据库表并使用\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory.

检查旧的 MD5 加密密码的示例代码:

$md5PasswordProcessor = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Saltedpasswords\\Salt\\Md5Salt');

$sampleLoginData = array(
    'uname' => $usernameSample
    'uident' => $unencryptedPassword,
    'status' => 'login'
);

$frontEndUserAuth = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Authentication\\FrontendUserAuthentication');
$frontEndUserAuth->checkPid = false;

$info = $frontEndUserAuth->getAuthInfoArray();
$info['db_user']['username_column'] = 'email';

$user_db = $frontEndUserAuth->fetchUserRecord($info['db_user'], $sampleLoginData['uname']);

$passwordByMd5 = $md5PasswordProcessor->checkPassword($byPasswordDecrypt, $user_db['password']);

if($passwordByMd5 === true) {
    // Check is correct, update your database here by, for example:
    $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(null);
    $saltedPassword = $objSalt->getHashedPassword($unencryptedPassword);

    // And your queryBuilder should be written here
}

我希望我能帮助其他人解决这个问题。

于 2017-10-26T10:42:49.163 回答