当用户在网站上注册时,我在密码表中查看数据库joomla_users,密码以下列格式存储:
$ P $ Do8QrURFT1r0NlWf0X / GRDF / aMqwqK /
$ P $ DH38Lch9z508gJiop3A6u0whTity390
但不是文档中描述的形式(MD5 +“:”+ SALT):
我需要为我澄清这一点,因为我正在使用外部脚本检查用户凭据以检查密码匹配。
在我的PHP脚本中,我有代码将SALT与数据库中的密码分开:
$parts = explode( ':', $password_database );
$crypt = $parts[0];
$salt = $parts[1];
但如果没有dobule结(:)
,我就不能这样做答案 0 :(得分:14)
试试这个,
以下代码创建了Joomla标准密码(旧版本1.5,1.7等)。
jimport('joomla.user.helper');
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword($password_choose, $salt);
$password = $crypt.':'.$salt;
Joomla 3.2 + 引入了PHP的密码算法 bcrypt ,但它需要最低PHP 5.3 + 如果您打算使用 bcrypt < / strong>确保您的服务器PHP版本具有此功能,read more here。
Joomla的另一个版本使用以下方法( Joomla 3.x )
jimport('joomla.user.helper');
$yourpass = JUserHelper::hashPassword($password_choose);
旧算法在最新版本中也可以正常工作,唯一不同的是旧版本创建65个字符的密码而新的创建34个字符串。始终使用更新版本
另外如果你使用外部脚本应该包括如下的Joomla框架。这应该在你的外部php文件的顶部
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
你还提到你必须检查用户凭证,然后不需要检查密码格式,所有的东西只是在框架加载后使用下面的代码。
$credentials['username'] = $data['username']; //user entered name
$credentials['password'] = $data['password']; //users entered password
$app = JFactory::getApplication();
$error = $app->login($credentials, $options);
if (!JError::isError($error)) {
// login success
}
else{
//Failed attempt
}
希望它有所帮助..
答案 1 :(得分:10)
Joomla的默认用户类不再使用salted MD5来散列密码。 JUser
类的绑定功能现在调用JUserHelper::hashPassword($array['password'])
来加密密码。
目前这个功能是这样的:
public static function hashPassword($password)
{
// Use PHPass's portable hashes with a cost of 10.
$phpass = new PasswordHash(10, true);
return $phpass->HashPassword($password);
}
这意味着它现在依赖于PHPass,你可以在这里阅读更多信息:http://www.openwall.com/phpass/。基于阅读本网站的介绍,我猜测加密现在是bcrypt
而不是MD5,但Joomla可能已经覆盖了默认加密。
答案 2 :(得分:5)
在David Fritsch的回答下,我可以像Joomla那样使用加密密码:
<?php
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );
require_once( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
jimport('joomla.user.helper');
$password = "test";
echo "<strong>Password: </strong>" . JUserHelper::hashPassword($password);
?>
请注意,您必须将文件存储在joomla根目录中,或更改JPATH_BASE。