Magento Enterprise と Community の両方のエディションで、パスワードの保存に異なるアルゴリズムが使用されていることに気付きました。コミュニティ エディションが md5 を使用していることは知っています。エンタープライズ エディションで使用されているメカニズムと、コミュニティ エディションに移行する場合にエンタープライズ パスワードを復号化する方法を教えてください。
5 に答える
ハッシュは一方向暗号化です。パスワードを解読することはできません。
パスワードの基本操作:
顧客はアカウントにサインアップし、パスワードを入力します。システムはソルトを追加し、パスワードを暗号化し、結果のパスワード ハッシュをデータベースに保存します。
顧客はログインし、パスワードを入力します。システムはソルトを追加し、パスワードを暗号化し、生成されたパスワード ハッシュを保存されたパスワード ハッシュと比較します。ハッシュが等しい場合、ログイン システムは、パスワード自体を実際に知らなくても、顧客がパスワードを知っていることを認識します。
したがって、あるシステムが SHA1 を使用し、別のシステムが期限切れの古い MD5 を使用している場合、パスワードをシステムに戻す唯一の方法は、顧客にパスワードを再入力してもらい、新しいハッシュ アルゴリズムが呼び出され、新しいハッシュが保存されるようにすることです。
エンタープライズ ソース コードがあり、エンタープライズ ハッシュ関数を使用してパスワードを保存および比較するモジュールを記述します。CE には、パスワードを保存するための更新されたセキュリティ強化された方法があり、パスワード ハッシュを古いサイト。
いくつかの追加情報:
使用される暗号化方式は、Mage_Core_Model_Encryption クラスにあります。
対象となる 3 つの関数は次のとおりです。
public function hash($data)
public function getHash($password, $salt = false)
public function validateHash($password, $hash)
1.7.xx からの機能コード
>
public function hash($data)
{
return md5($data);
}
>
public function getHash($password, $salt = false)
{
if (is_integer($salt)) {
$salt = $this->_helper->getRandomString($salt);
}
return $salt === false ? $this->hash($password) : $this->hash($salt . $password) . ':' . $salt;
}
>
public function validateHash($password, $hash)
{
$hashArr = explode(':', $hash);
switch (count($hashArr)) {
case 1:
return $this->hash($password) === $hash;
case 2:
return $this->hash($hashArr[1] . $password) === $hashArr[0];
}
Mage::throwException('Invalid hash.');
}
CE と Enterprise の両方が同じルーチンを使用しているようです。Enterprise コードがあるので確認する必要があります。
app/etc/local.xml ファイルの暗号化キーをエンタープライズ バージョンのキーと一致するように変更し、エンタープライズ データを CE データベースにインポートすると、暗号化されたデータにアクセスできるようになります。ただし、パスワードはハッシュとして保存され (上記の関数ブロックを参照)、そのため元に戻すことはできません。暗号化キーが保存されている local.xml の関連セクション:
<crypt>
<key>< ![CDATA[-encryption-key-here-]]></key>
</crypt>
私はそれがあなたapp/etc/local.xml
またはapp/etc/enterprise.xml
MagentoEEにあると思います
MagentoEnterpriseEditionの復号化機能
/**
* Decrypt a string
*
* @param string $data
* @return string
*/
public function decrypt($data)
{
return str_replace("\x0", '', trim($this->_getCrypt()->decrypt(base64_decode((string)$data))));
}
と
/**
* Instantiate crypt model
*
* @param string $key
* @return Varien_Crypt_Mcrypt
*/
protected function _getCrypt($key = null)
{
if (!$this->_crypt) {
if (null === $key) {
$key = (string)Mage::getConfig()->getNode('global/crypt/key');
}
$this->_crypt = Varien_Crypt::factory()->init($key);
}
return $this->_crypt;
}
EnterpriseEditionまたはCommunityEditionでも同じ機能のようです。Magento Enterprise Editionの所有者にクリプトキーを要求し、CEで復号化する必要があります。Magento Enterprise Editionのコードに忍び込んでいて、コードはCommunity Edition と同じであるため(暗号化/復号化用) 、問題ありません。
コメント1の後に追加
/**
* Hash a string
*
* @param string $data
* @return string
*/
public function hash($data)
{
return md5($data);
}
/**
* Validate hash against hashing method (with or without salt)
*
* @param string $password
* @param string $hash
* @return bool
* @throws Exception
*/
public function validateHash($password, $hash)
{
$hashArr = explode(':', $hash);
switch (count($hashArr)) {
case 1:
return $this->hash($password) === $hash;
case 2:
return $this->hash($hashArr[1] . $password) === $hashArr[0];
}
Mage::throwException('Invalid hash.');
}
また、パスワード アルゴリズムが異なる別のシステムに移行しました。私たちがしたことは、フィアスコが示唆するようなものでした。
-> Magento_Core_Model_Encryption を上書きするカスタム モジュールを作成しhash
、暗号化されたパスワードのアルゴリズムに一致するように関数を変更します。
モジュール設定で:
<global>
<helpers>
<core>
<encryption_model>MyCompany_Module_Model_Encryption</encryption_model>
</core>
</helpers>
</global>
過去に Magento Enterprise から Magento Community への移行を成功させました。パスワードがソルト化されている場合、それらを復号化して Magento コミュニティで使用することはできません。
あなたの最善の選択肢は、人々がパスワードを変更するか、各顧客のパスワードを自動生成して送信する必要があることを伝えるニュースレターを大量に送信することです.
どちらも MD5 を使用する必要があります。
おそらく、1 つにはソルトがあり、もう 1 つにはありませんが、下位互換性があります。