/** * Encriptar datos. Devuelve un array con los datos encriptados y el IV. * * @param mixed $data string Los datos a encriptar * @param string $pwd La clave de encriptación * @return array * @throws SPException */ public static function encryptData($data, $pwd = null) { if (empty($data)) { return array('data' => '', 'iv' => ''); } // Comprobar el módulo de encriptación if (!Crypt::checkCryptModule()) { throw new SPException(SPException::SP_CRITICAL, _('Error interno'), _('No se puede usar el módulo de encriptación')); } // Encriptar datos $encData['data'] = Crypt::mkEncrypt($data, $pwd); if (!empty($data) && ($encData['data'] === false || is_null($encData['data']))) { throw new SPException(SPException::SP_CRITICAL, _('Error interno'), _('Error al generar datos cifrados')); } $encData['iv'] = Crypt::$strInitialVector; return $encData; }
/** * Añadir un nuevo nodo al árbol raíz * * @param \DOMElement $node El nodo a añadir * @throws SPException */ private function appendNode(\DOMElement $node) { try { // Si se utiliza clave de encriptación los datos se encriptan en un nuevo nodo: // Encrypted -> Data if ($this->_encrypted === true) { // Obtener el nodo en formato XML $nodeXML = $this->_xml->saveXML($node); // Crear los datos encriptados con la información del nodo $encrypted = Crypt::mkEncrypt($nodeXML, $this->_exportPass); $encryptedIV = Crypt::$strInitialVector; // Buscar si existe ya un nodo para el conjunto de datos encriptados $encryptedNode = $this->_root->getElementsByTagName('Encrypted')->item(0); if (!$encryptedNode instanceof \DOMElement) { $encryptedNode = $this->_xml->createElement('Encrypted'); } // Crear el nodo hijo con los datos encriptados $encryptedData = $this->_xml->createElement('Data', base64_encode($encrypted)); $encryptedDataIV = $this->_xml->createAttribute('iv'); $encryptedDataIV->value = base64_encode($encryptedIV); // Añadir nodos de datos $encryptedData->appendChild($encryptedDataIV); $encryptedNode->appendChild($encryptedData); // Añadir el nodo encriptado $this->_root->appendChild($encryptedNode); } else { $this->_root->appendChild($node); } } catch (\DOMException $e) { throw new SPException(SPException::SP_WARNING, $e->getMessage(), __FUNCTION__); } }
/** * Actualiza las claves de todas las cuentas con la nueva clave maestra. * * @param string $currentMasterPass con la clave maestra actual * @param string $newMasterPass con la nueva clave maestra * @param string $newHash con el nuevo hash de la clave maestra * @return bool */ public function updateAccountsMasterPass($currentMasterPass, $newMasterPass, $newHash = null) { $accountsOk = array(); $userId = Session::getUserId(); $demoEnabled = Util::demoIsEnabled(); $errorCount = 0; $Log = new Log(_('Actualizar Clave Maestra')); $Log->addDescription(_('Inicio')); $Log->writeLog(); $Log->resetDescription(); if (!Crypt::checkCryptModule()) { $Log->addDescription(_('Error en el módulo de encriptación')); $Log->writeLog(); return false; } $accountsPass = $this->getAccountsPassData(); if (!$accountsPass) { $Log->addDescription(_('Error al obtener las claves de las cuentas')); $Log->writeLog(); return false; } foreach ($accountsPass as $account) { $this->setAccountId($account->account_id); $this->setAccountUserEditId($userId); // No realizar cambios si está en modo demo if ($demoEnabled) { $accountsOk[] = $this->getAccountId(); continue; } if (strlen($account->account_pass) === 0) { $Log->addDescription(_('Clave de cuenta vacía') . ' (' . $account->account_id . ') ' . $account->account_name); continue; } if (strlen($account->account_IV) < 32) { $Log->addDescription(_('IV de encriptación incorrecto') . ' (' . $account->account_id . ') ' . $account->account_name); } $decryptedPass = Crypt::getDecrypt($account->account_pass, $account->account_IV); $this->setAccountPass(Crypt::mkEncrypt($decryptedPass, $newMasterPass)); $this->setAccountIV(Crypt::$strInitialVector); if ($this->getAccountPass() === false) { $errorCount++; $Log->addDescription(_('No es posible desencriptar la clave de la cuenta') . ' (' . $account->account_id . ') ' . $account->account_name); continue; } if (!$this->updateAccountPass(true)) { $errorCount++; $Log->addDescription(_('Fallo al actualizar la clave de la cuenta') . ' (' . $this->getAccountId() . ') ' . $account->acchistory_name); continue; } $accountsOk[] = $this->getAccountId(); } // Vaciar el array de mensajes de log if (count($Log->getDescription()) > 0) { $Log->writeLog(); $Log->resetDescription(); } if ($accountsOk) { $Log->addDescription(_('Cuentas actualizadas') . ': ' . implode(',', $accountsOk)); $Log->writeLog(); $Log->resetDescription(); } $Log->addDescription(_('Fin')); $Log->writeLog(); Email::sendEmail($Log); return true; }