2014-01-23 57 views
9

當網站上的用戶註冊,和我期待在密碼錶的數據庫joomla_users,還有存儲在以下格式的密碼:的Joomla 3.2.1密碼加密

  • $ P $ Do8QrURFT1r0NlWf0X/GRDF/aMqwqK/

  • $ P $ DH38Lch9z508gJiop3A6u0whTity390

  • ........

但不是我n的文檔(MD5 + 「:」 + SALT)中所描述的形式

  • 1802ebc64051d5b4f4d1b408babb5020:0PHJDbnsyX05YpKbAuLYnw2VCzFMW2VK

我需要有這個澄清對我來說,因爲我使用的外部腳本檢查用戶憑據以檢查密碼匹配。

在我的PHP腳本我有一個從密碼數據庫從鹽的方式隔開代碼:

$parts = explode(':', $password_database); 
$crypt = $parts[0]; 
$salt = $parts[1]; 

但我不能這樣做,如果沒有dobule結(:)

+2

我希望*他們還沒有使用MD5,它很虛弱。 – Quentin

+0

這不是md5,它是鹽醃md5,雖然不如現在使用的那麼好,但是它非常不同。 – Elin

+0

是的,但這是最後一個可用的joomla versio ... – Gregor

回答

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確保您的服務器的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 
    } 

希望它有助於..

+0

嗨。有了這個嘗試'測試'作爲密碼,我得到一個65個字符的字符串:$ P $ D6qfmWHlMjUFNUxiYnt5qawXZ1bOTP。但更改用戶的密碼在BD中測試我得到一個34個字符的字符串:$ P $ D6qfmWHlMjUFNUxiYnt5qawXZ1bOTP。 爲什麼? – Mikel

+0

@OceanicSix如何從管理員端更改密碼?它使用默認的joomla腳本或您自己的自定義代碼。它總是創建長度爲65char的密碼。 –

+0

我的意思是使用Jobin在他的第一部分代碼中說的我得到了一個65個字符的密碼。 更改爲用戶的密碼(在後端/管理員視圖),然後在數據庫中存儲已存儲的內容,該字符串有34個字符。所以這是joomla如何存儲密碼。 我終於可以用David Fritsch代碼做34個字符的加密密碼。 – Mikel

10

Joomla的默認用戶類別不再使用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可能會覆蓋默認加密。

+1

對於未來訪問者 - 此代碼散列「測試」爲: $ P $ DCeSr0.vZrpBk6GK.q8​​VrltNIdwetN0 – Krzysiek

5

隨着大衛·弗裏奇答案我可以做一個加密的密碼的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。

+1

對於未來的訪問者 - 此代碼輸出(Joomla 3.4.4): 密碼:$ 2y $ 10 $ upX58HulZWgBwKps2DaB9eoi2jI90H3i.JP3aSJ Q.QwJWDo62l/Cy – Krzysiek

+0

對於未來的訪問者,我發現實際上(與Joomla! 3.5.1)即使插入了相同的密碼,散列值也會始終不同。 – diegov