如何加密存储在数据库中的Joomla配置参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何加密存储在数据库中的Joomla配置参数?相关的知识,希望对你有一定的参考价值。

我发现了这个问题,这与我需要做的事情完全相同:How do you Encrypt and Decrypt a PHP String?在保存数据之前,我已经做了一切工作以加密数据。在事件函数onExtensionBeforeSave中,我可以访问该表。我可以从jinput获取需要加密的值并加密它们。我无法弄清楚的是如何将加密数据放入表对象中,以便在存储/保存之前替换未加密的数据。

答案

我能够弄清楚这一点。在扩展事件onExtensionBeforeSave中,我获取post数据,加载config.xml文件以检查我的自定义字段的表单字段(type ='encryptedtext'),加密那些并使用表对象绑定并检查它,所以它将被正确存储。

     function onExtensionBeforeSave($context, $table, $isNew)
 {
     $jinput = JFactory::getApplication()->input;
     $component = $jinput->get('component');

     if($component !== 'com_store') // Only encrypting fields in the store component for now
     {
         return true;
     }

     $form_path = JPATH_ADMINISTRATOR . '\components\' . $component . '\config.xml';
     $xml = simplexml_load_file($form_path);
     $has_encrypted = false;
     foreach($xml->fieldset as $fieldset)
     {
         foreach($fieldset as $field)
         {
            if($field['type'] == 'encryptedtext') // is our custom form field type to be encrypted
            {
                $has_encrypted = true;
                if(!$fields) // get fields if it hasn't already been done
                {
                    $fields = $jinput->get('jform', '', 'array');   
                }
                $field = (string)$field['name'];
                $value = (string)$fields[$field];
                $cipher = "aes-256-ctr";
                $ivlen = openssl_cipher_iv_length($cipher);
                $iv = openssl_random_pseudo_bytes($ivlen, $isStrongCrypto);
                if (!$isStrongCrypto) 
                {
                    throw new Exception("Not a strong key");
                }
                $keyhash = openssl_digest($component, 'sha256', true);
                $opts =  OPENSSL_RAW_DATA;
                $encrypted = openssl_encrypt($value, $cipher, $keyhash, $opts, $iv);
                if ($encrypted === false)
                {
                    throw new Exception('Encryption failed: ' . openssl_error_string());
                }
                $result = $iv . $encrypted;
                $result = base64_encode($result);
                $fields[$field] = $result;
            }
         }
     }         
     if(!has_encrypted)
     {
         return false;
     }
     $data = array(
         'params'=>$fields,
         'option'=>$component
     );
     if (!$table->bind($data))
     {
         throw new RuntimeException($table->getError());
     }
     if (!$table->check())
     {
         throw new RuntimeException($table->getError());
     }
     return true;
}

剩下的就是在自定义字段的getInput函数中解密它。如果有人需要,我会回答这个问题,如果人们看到改进,或者它是完全垃圾,我会喜欢一些批评......

以上是关于如何加密存储在数据库中的Joomla配置参数?的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 3.0 组件参数存储在哪里?

php 如何在Joomla中的任何位置访问Joomla插件参数

joomla密码加密

如何在joomla中建立链接

如何在 EC2 上集成 AWS 参数存储以使用 Python 代码加密令牌/API 密钥? [关闭]

在 joomla 组件中,我应该在哪里存储数据库函数,以及如何调用它们?