Védekezési stratégiák

Nyilván titkosítással lehet megvédeni adatainkat, no de ez sem olyan egyszerű kérdés. Az alábbiakban ezzel foglalkozunk.

Négy fő követelménye van a hálózati biztonságnak: a titkosság, a hitelesség, a letagadhatatlanság és a sérthetetlenség. Távoli gépeknél fontos, hogy ellenőrizni tudja egy kiszolgáló, hogy a tőle adatokat vagy szolgáltatásokat kérő távoli gép vajon tényleg az-e, akinek kiadja magát, és ennek megfelelően van-e joga azokhoz a dolgokhoz, amiket kér. Ez a hitelesítés témaköre. A letagadhatatlanság és sérthetetlenség inkább banki meg pénzügyi területeken fontos: ha egyszer létrejött egy szerződés vagy más hivatalos dokumentum, akkor azt később egyik fél se tudja letagadni, illetve megmásítani semmilyen okból (pl. bank, arany).

A “lehallgató támadók” két fajtája létezik: az aktív illetve a passzív támadó. A passzív csak hallgatódzik, az aktív meg bele is nyúl az általa elért adatokba.

A hálózati biztonság (az adatok titokbantartása értelemben) mindegyik hálózati réteghez hozzátartozik, mi most az alkalmazási szintet vizsgáljuk, ennek módszereit.

Hagyományosan kétfajta titkosítási módszert különböztetünk meg: a helyettesítő, illetve a keverő típusú titkosítást. A helyettesítő titkosításnál minden betű vagy betűcsoport egy másikra helyettesítődik egy előre legyártott kulcs alapján, míg a keverő eljárás csak a sorrendet változtatja meg. Itt a kulcs egy olyan szó pl. amiben minden betű egyszer fordul csak elő, és az előforduló betűk abc-s sorrendjének megfelelően kell a forrásszöveg karaktereit megkutyulni.

Két alapvető kriptográfiai (titkosítási) elv a következő: 1: redundancia, 2: visszajátszhatatlanság. A redundancia alatt azt értjük, hogy a titkosításnál a “csomagokba” olyan fölösleges karaktereket is teszünk, amik csak azért vannak, hogy megnehezítsék az aktív támadók dolgát a valódinak tűnő üzenetek gyártásánál. A visszajátszhatatlanságot például időbélyegekkel biztosíthatjuk (ne játszhassanak vissza korábbi, valódi üzeneteket).

A DES és az IDEA

Régen azt az elvet követték, hogy egyszerű algoritmusokat hoztak létre, és a kód feltörhetetlenségét hosszú – és így biztonságos – kulcsokkal akarták biztosítani. Ma ennek az ellenkezője érvényes: bonyolult algoritmusokat hoznak létre, hogy ezt ne tudja kiismerni a kódtörő. Mindkét elv azonban titkos kulcsú algoritmusokat használ, a kulcs mindig rejtett (legalábbis ez a cél), és csak a felhasználók ismerik. Ilyen a DES (Data Encryption Standard) és az IDEA (International Data Encryption Algorythm). Ma már léteznek azonban nyilvános kulcsú algoritmusok is, sőt, ezek a jobbak, amelyek valójában két kulcsból állnak: egy nyilvános bekódoló kulcsból, és egy titkos dekódolókulcsból. Ez a két kulcs egymástól független, nem állíthatók elő egymásból.

A DES-t 1977-ben fejlesztették ki. 56 bites kulcsszót használ, 64 bites blokkokkal, a keverő és helyettesítéses technikákat együtt. Jó bonyolult az algoritmus, de ma már nem számít megbízhatónak. Hozzá hasonló az IDEA (1990., 1992.), amely 128 bites kulcsot használ, és amely jelenleg emberi idő alatt nem feltörhető.

Az RSA

Az RSA nyilvános kulcsú algoritmus, 1978-ban fejlesztette ki az M. I. T. három kutatója, Rivest, Shamir, és Adleman (innen a név). Főbb lépései:

  1. Válasszunk két nagy prímszámot, p-t és q-t (lehetőleg 10^100-nál nagyobb számok legyenek).
  2. Számoljuk ki az n=pq és a z=(p-1)(q-1) számokat.
  3. Válasszunk egy z-hez relatív prímet, jelöljük d-vel.
  4. Keressünk egy olyan e számot, melyre ed=1 mod z.

Ezekután a titkosítás: a nyílt szöveget, mint egyszerű bitsorozatot n-nél kisebb hosszúságú blokkokra osztjuk. A titkosítandó üzenetdarab alapján kiszámoljuk a C=P^e (mod n) értéket. A visszakódoláshoz a P=C^d (mod n) összefüggést használjuk. Látjuk, hogy a kódoláshoz az e és n számok szükségesek, a visszafejtéshez pedig a d és n számok, tehát a nyilvános kulcs az (e,n) számpárból, az egyéni kulcs pedig a (d,n) számpárból áll.

Egy másik nyilvános kulcsú eljárás, amit szintén 1978-ban fejlesztettek ki (Merkle és Hellman), a hátizsák (knapsack) algoritmus, aminek érdekes a sztorija, viszont nem tekintik biztonságos módszernek, és ennek megfelelően nem is használják.
Vissza
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>
  • Előre