我的客户端有一个旧的TYPO3 6.2安装,该安装已经在TYPO3 8.7中重建。
在旧的TYPO3 6.2安装中,fe_users表拥有大约15.000名使用MD5/crypt(3)加密密码(从$1美元开始)的用户。在fe_users 8.7中为客户端重建的密码现在基于新的密码(从$pbkdf2-sha256$开始)。到现在为止还好。
旧的TYPO3 6.2 fe_users将导入到新数据库中,但我在使用自己的REST (构建在TYPO3 8.7中)登录时遇到问题,使用felogin的登录都是成功的。在felogin成功登录后,密码被转换为它们的新加密,我能够使用REST登录。-在使用REST之前,felogin登录15.000用户绝对不是一种选择:)
REST使用\TYPO3\CMS\Saltedpasswords\进行比较。
tl;dr:如何在不强迫他们使用felogin的情况下检查\TYPO3\CMS\Saltedpasswords\的成功加密?
REST 的示例代码
下面代码中的$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']);
}
}如果有人能指出正确的方向,成功的密码-散列检查,这将是绝对伟大的,我会非常感谢!
发布于 2017-10-26 10:42:49
我自己解决了这个问题,并把我自己的问题写了出来,希望能在这个问题上帮助别人。
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
}我希望我能帮助其他人解决这个问题。
https://stackoverflow.com/questions/46906363
复制相似问题