2012-05-03 44 views
31

Tôi cần truy cập bảng người dùng joomla jos_users để kiểm tra đăng nhập từ tập lệnh php bên ngoài [codeignitor].Mã hóa mật khẩu joomla

joomla lưu trữ mật khẩu như thế này

4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT 

Hình như đây không phải là bình thường MD5, vì vậy tôi không thể sử dụng md5(password).

cách có thể để tạo mật khẩu là gì?

Cảm ơn bạn.

+1

câu hỏi sâu :) và nếu bạn vẫn nghĩ rằng md5 là cách bình thường để lưu trữ mật khẩu, bạn có thể muốn nghiên cứu thêm một chút về điều đó – mishu

+4

Chỉ cần một FYI, MD5 KHÔNG BAO GIỜ được sử dụng cho mật khẩu băm. Không bao giờ. Đặc biệt là không có muối như trong ví dụ của bạn. – tangrs

+0

Cảm ơn thông tin; Nhưng ở đây tôi không về để tạo ra một lĩnh vực mật khẩu. – Red

Trả lời

55

Mật khẩu Joomla được băm MD5, nhưng mật khẩu được muối trước khi được băm. Chúng được lưu trữ trong cơ sở dữ liệu là {hash}:{salt} muối này là một chuỗi ký tự ngẫu nhiên dài 32 ký tự.

Vì vậy, để tạo một hash mật khẩu mới, bạn sẽ làm gì md5($password.$salt)

EDIT

Được rồi vì vậy để kiểm tra mật khẩu, hãy nói một người dùng myguy đi vào mật khẩu mypassword, bạn sẽ lấy hàng từ cơ sở dữ liệu có tên người dùng myguy.

Trong hàng này, bạn sẽ tìm thấy mật khẩu có nội dung 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT. Bạn chia ra các hash mật khẩu và muối:

$hashparts = preg_split (':' , $dbpassword); 
echo $hashparts[0]; //this is the hash 4e9e4bcc5752d6f939aedb42408fd3aa 
echo $hashparts[1]; //this is the salt 0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT 

tại tính toán băm sử dụng muối này và mật khẩu myguy vào

$userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash 

Bây giờ nếu điều này $userhash$hashparts[0] giống hệt người dùng đã bước vào mật khẩu chính xác.

+0

làm thế nào tôi có thể nhận được '$ salt' ?? – Red

+3

Đối với mật khẩu hiện có, chỉ cần lấy chuỗi sau khi ':' là muối. Để tạo một mật khẩu mới, muối chỉ tạo ra một chuỗi ngẫu nhiên. Như Er. Anurag Jain đã nói trong câu trả lời của mình, bạn có thể dễ dàng thực hiện điều này với 'JUserHelper :: genRandomPassword (32)' – klennepette

+0

Xin lỗi, nhưng tôi vẫn không thể tìm ra câu trả lời cho câu hỏi, giả sử rằng người dùng có một chữ "hello", nhưng làm sao tôi biết số ngẫu nhiên? được tạo và lưu trữ trong db bởi JOOMLA .. – Red

0

Joomla "hiểu" mật khẩu có md5 "bình thường".

Những gì tôi đã làm trước đây (để kiểm tra thông tin đăng nhập của người dùng), là để lưu mật khẩu ban đầu, mã hóa mật khẩu mới trong md5, thay thế nó trong cơ sở dữ liệu, kiểm tra nó bằng trình duyệt (và nó hoạt động) và khi tôi đã hoàn tất, hãy dán mật khẩu ban đầu vào cơ sở dữ liệu.

+0

Xin lỗi jackJoe Nhưng mật khẩu joomla không phải là một băm md5 bình thường. Nó là sự kết hợp của băm md5 và khóa bí mật joomla. –

+0

@ShaikhFarooque Tôi biết, tôi đã đưa ra một gợi ý về cách sử dụng md5 bình thường để kiểm tra mật khẩu. – jackJoe

+0

Không còn nữa, Nó không sử dụng MD5 kể từ phiên bản 3. – nemesys

22

Từ joomla diễn đàn, đó là những gì xảy ra đằng sau:

A. Generate a password 
B. Generate a string with 32 random characters 
C. Concatenate Password (Step A) and RandomString (Step B) 
D. Take md5(Result of Step C) 
E. store Step D Result : Step B Result 

Ví dụ:

Generate a password - Let 'testing' 
Generate a string of 32 random characters - 'aNs1L5PajsIscupUskaNdPenustelsPe' 
Concatenate Password and random string - testingaNs1L5PajsIscupUskaNdPenustelsPe 
md5(Step C Result) - 5cf56p85sf15lpyf30c3fd19819p58ly 
store step d:step B - 5cf56p85sf15lpyf30c3fd19819p58ly:aNs1L5PajsIscupUskaNdPenustelsPe 

Bạn có thể tìm mã trong Joomla như

$salt = JUserHelper::genRandomPassword(32); 
$crypt = JUserHelper::getCryptedPassword("testing", $salt); 
$password = $crypt . ':' . $salt; 

Hoặc Chúng ta có thể nói

password DB field = md5(password + salt) + ":" + salt 

Nơi muối là ngẫu nhiên 32 chuỗi char.

nhờ

+0

Tôi không muốn đăng ký một người dùng mới, tôi cần phải lấy chuỗi hiện tại trên trường mật khẩu. Do đó tôi có thể khớp với mật khẩu người dùng đã cho và mật khẩu trên trường mật khẩu. – Red

+1

md5 là một cách băm, có nghĩa là bạn chỉ có thể mã hóa nó nhưng không đảo ngược giải mã, nó không có khả năng làm dycription Bạn có thể làm một thứ mà đầu tiên lấy 32 chuỗi ngẫu nhiên xe từ mật khẩu db, và với sự trợ giúp của khóa bảo mật đó tạo mật khẩu kiểu joomla từ mật khẩu nhập và khớp với cả hai ... –

+0

làm thế nào tôi có thể lấy chuỗi ngẫu nhiên từ mật khẩu? làm thế nào nó sẽ posible? – Red

5

Trong joomla tiêu chuẩn mà bạn có thể tạo mật khẩu bằng cách sử dụng cách sau

     jimport('joomla.user.helper'); 
      $salt = JUserHelper::genRandomPassword(32); 
      $crypt = JUserHelper::getCryptedPassword($password_choose, $salt); 
      $password = $crypt.':'.$salt; 

bạn đề cập rằng bạn đang truy cập từ tập tin bên ngoài (hay chương trình) sau đó nếu bạn có cài đặt joomla trên phía bên kia bạn có thể truy cập nó từ bên ngoài cấu trúc joomla.

sử dụng khung làm việc mặc định joomla như thế này

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(); 
+0

http://stackoverflow.com/questions/10409432/access-joomla-session -in-php-codeigniter - câu hỏi này vẫn chưa được trả lời :) – Red

3

tôi không thể sử dụng preg_split nhưng explode hoạt động tốt.

$hashparts = explode (':' , $dbpassword); 
0

Nếu bạn chỉ sử dụng md5 ($ mật khẩu); nó sẽ hoạt động, hãy thử nó. Joomla có một cơ chế và nó có thể làm việc với nhiều loại mật khẩu (bao gồm cả mật khẩu mạnh). Bạn không phải lo lắng về phần sau đại tràng. Chỉ cần sử dụng md5 ($ mật khẩu) và nó chắc chắn sẽ hoạt động.

Nhân tiện, điều này cũng sẽ hoạt động trên Joomla 3.x.

1

Từ thư viện tệp nguồn Joomla/joomla/crypt/password/simple.php có nhiều cách để chúng được lưu trữ và một số không có ký tự ':'.

switch ($type) 
    { 
     case '$2a$': 
     case JCryptPassword::BLOWFISH: 
      if (JCrypt::hasStrongPasswordSupport()) 
      { 
       $type = '$2y$'; 
      } 
      else 
      { 
       $type = '$2a$'; 
      } 

      $salt = $type . str_pad($this->cost, 2, '0', STR_PAD_LEFT) . '$' . $this->getSalt(22); 

      return crypt($password, $salt); 

     case JCryptPassword::MD5: 
      $salt = $this->getSalt(12); 

      $salt = '$1$' . $salt; 

      return crypt($password, $salt); 

     case JCryptPassword::JOOMLA: 
      $salt = $this->getSalt(32); 

      return md5($password . $salt) . ':' . $salt; 


    } 
} 
2

Joomla! sử dụng PhPass.

root/libraries/phpass/PasswordHash.php 

hãy xem tại đây. bạn sẽ thấy ở đây cách tạo mật khẩu.

Các $ 2y là mặc định (và ưa thích) prefix trên bcrypt băm. Đối với mã, bạn sẽ muốn xem bên trong các phương thức JUserHelper'shashPasswordverifyPassword để xem cách Joomla đang làm việc với mọi thứ ngay bây giờ.


Một số Referances -

https://github.com/joomla/joomla-cms/blob/3.4.1/libraries/joomla/user/helper.php#L296-L387

https://docs.joomla.org/API15:JUserHelper/getCryptedPassword

https://docs.joomla.org/API15:JUserHelper/getSalt

Kiểm tra các liên kết, tôi hy vọng bạn nó sẽ hữu ích :)

+0

ya trông giống như từ joomla v3.2.2 họ đã chuyển sang phpass – user889030

0
<?php 
$r = bin2hex(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)); 
$p = 'the_password'; 

$s = $p . $r; 
$m = md5($s); 

$out = $m . ':' . $r; 
echo $out; 

Len 16 vì bin2hex tăng gấp đôi kích thước ký tự, vì 1 byte trở thành 2 byte

Các vấn đề liên quan