/** * Procesar los datos encriptados y añadirlos al árbol DOM desencriptados */ protected function processEncrypted() { foreach ($this->_xmlDOM->getElementsByTagName('Data') as $node) { $data = base64_decode($node->nodeValue); $iv = base64_decode($node->getAttribute('iv')); $xmlDecrypted = Crypt::getDecrypt($data, $iv, $this->getImportPass()); $newXmlData = new \DOMDocument(); // $newXmlData->preserveWhiteSpace = true; $newXmlData->loadXML($xmlDecrypted); $newNode = $this->_xmlDOM->importNode($newXmlData->documentElement, TRUE); $this->_xmlDOM->documentElement->appendChild($newNode); } // Eliminar los datos encriptados tras desencriptar los mismos if ($this->_xmlDOM->getElementsByTagName('Data')->length > 0) { $nodeData = $this->_xmlDOM->getElementsByTagName('Encrypted')->item(0); $nodeData->parentNode->removeChild($nodeData); } }
/** * Actualizar los datos encriptados con una nueva clave * * @param string $currentMasterPass La clave maestra actual * @param string $newMasterPassword La nueva clave maestra * @return bool * @throws SPException */ public static function updateCustomFieldsCrypt($currentMasterPass, $newMasterPassword) { $Log = new Log(); $Log->setAction(_('Campos Personalizados')); $query = 'SELECT customfielddata_id, customfielddata_data, customfielddata_iv FROM customFieldsData'; DB::setReturnArray(); $queryRes = DB::getResults($query, __FUNCTION__); if ($queryRes === false) { $Log->addDescription(_('Fin')); $Log->writeLog(); return true; } $Log->addDescription(_('Actualizando datos encriptados')); $Log->writeLog(true); $errors = array(); $success = array(); foreach ($queryRes as $customField) { $fieldData = Crypt::getDecrypt($customField->customfielddata_data, $customField->customfielddata_iv, $currentMasterPass); $fieldCryptData = Crypt::encryptData($fieldData, $newMasterPassword); $query = 'UPDATE customFieldsData SET ' . 'customfielddata_data = :data, ' . 'customfielddata_iv = :iv ' . 'WHERE customfielddata_id = :id '; $data['id'] = $customField->customfielddata_id; $data['data'] = $fieldCryptData['data']; $data['iv'] = $fieldCryptData['iv']; if (DB::getQuery($query, __FUNCTION__, $data) === false) { $errors[] = $customField->customfielddata_id; } else { $success[] = $customField->customfielddata_id; } } if (count($errors) > 0) { $Log->addDescription(_('Registros no actualizados') . ': ' . implode(',', $errors)); $Log->writeLog(true); } if (count($success) > 0) { $Log->addDescription(_('Registros actualizados') . ': ' . implode(',', $success)); $Log->writeLog(true); } $Log->addDescription(_('Fin')); $Log->writeLog(); return count($errors) === 0; }
/** * Desencriptar la clave maestra de la sesión. * * @return string con la clave maestra */ public static function getSessionMPass() { $cryptPass = Crypt::generateAesKey(session_id()); return Crypt::getDecrypt(Session::getMPass(), Session::getMPassIV(), $cryptPass); }
/** * Desencriptar la clave maestra del usuario para la sesión. * * @param bool $showPass opcional, para devolver la clave desencriptada * @return false|string Devuelve bool se hay error o string si se devuelve la clave */ public function getUserMPass($showPass = false) { $query = 'SELECT user_mPass, user_mIV FROM usrData WHERE user_id = :id LIMIT 1'; $data['id'] = $this->_userId; $queryRes = DB::getResults($query, __FUNCTION__, $data); if ($queryRes === false) { return false; } if ($queryRes->user_mPass && $queryRes->user_mIV) { $clearMasterPass = Crypt::getDecrypt($queryRes->user_mPass, $queryRes->user_mIV, $this->getCypherPass()); if (!$clearMasterPass) { return false; } return $showPass === true ? $clearMasterPass : SessionUtil::saveSessionMPass($clearMasterPass); } return false; }
/** * 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; }
/** * Devuelve la clave maestra que ha sido encriptada con la clave temporal * * @param $pass string con la clave utilizada para encriptar * @return string con la clave maestra desencriptada */ public static function getTempMasterPass($pass) { $passLogin = hex2bin(ConfigDB::getValue('tempmaster_pass')); $passLoginIV = hex2bin(ConfigDB::getValue('tempmaster_passiv')); return Crypt::getDecrypt($passLogin, $passLoginIV, $pass); }