Autor Zpráva
midlan
Profil
Ahoj. Potřeboval bych nějakou šifru, kde nemá potencionální útočník šanci pomocí vícero zašifrovaných textů stejným klíčem dopočítat klíč.

Nejdřív jsem přemýšlel na Vernamovou Šifrou, která je v php přístupná jako:
<?php
$key ^ $text;
Ale na wikipedii píšou v podmínkách spolehlivosti v bodě 3 právě, že ze dvou zašifrovaných zpráv lze dopočítat klíč.

Chtěl bych tou šifrou šifrovat text captchy a přiložit hash textu do skrytého inputu, abych nemusel používat složitější způsoby jako sessions.
Díky.
Joker
Profil
midlan:
abych nemusel používat složitější způsoby jako sessions
…tak budete radši vymýšlet nějaký šifrovací algoritmus?

Navíc pro Vernamovu šifru by bylo pro každý CAPTCHA text nutné generovat náhodný klíč stejné délky, který by někde na serveru musel být uložený. Takže to už tamtéž rovnou může být uložený původní text a jen se přímo porovnat.

V každém případě hlavní slabina takového řešení je, že případný hacker se vůbec nemusí s nějakým dešifrováním namáhat. Jelikož jediné co se ověřuje je, jestli zadaný text odpovídá textu ve skrytém poli (po dešifrování), hackerovi stačí jen zařídit, aby byly stejné.
Takže prostě jednou otevře stránku ručně, vyluští CAPTCHA, uloží si správný výsledek a obsah toho skrytého pole a robot pak pokaždé v obou polích pošle ty hodnoty. A server ho nechá projít, protože zadaný text odpovídá textu ve skrytém poli (ačkoliv to není ten, který mu server původně poslal).
midlan
Profil
Joker:
V každém případě hlavní slabina takového řešení je, že případný hacker se vůbec nemusí s nějakým dešifrováním namáhat. Jelikož jediné co se ověřuje je, jestli zadaný text odpovídá textu ve skrytém poli (po dešifrování), hackerovi stačí jen zařídit, aby byly stejné.
Dlouho mi trvalo než jsem pochopil jak to myslíte. Tohle mi vůbec nedošlo. Takže mám zvolit ty sessions? S šifrou nebo bez?
Rfilip
Profil
Data sesion se ukladaji na serveru, tudiz staci bez sifry
whoami
Profil
Ale stejně není naškodu vygenerovat šifru..:
/* soubor generuj_obrazek.php */
session_start();
$_SESSION['captcha'] = hash('sha256', md5($captcha_plain).'salt'); // $captcha_plain obsahuje kód v obrázku
// zobraz obrázek..
Potom už jen odešleme formulář a zkontrolujeme..:
/* soubor zpracuj.php */
session_start();
if ( $_SESSION['captcha'] == hash('sha256', md5($_POST['captcha']).'salt') ) {
    echo 'ok';
} else {
    echo 'not ok';
}
Za předpokladu, že útočník nezná způsob hashování a obrázek je dost nečitelný + náhodný a neopakující se, je tento způsob bezpečný..
/* soubor formular.php */
<form action="zpracuj.php" method="POST">
    <img src="generuj_obrazek.php" alt="" />
    <input type="text" name="captcha" value="" />
    <input type="hidden" name="hash" value="<?= md5(rand()) ?>" />
    <input type="submit" value="Odeslat" />
</form>

Rfilip:
konkrétně do většionou [777] /tmp (nebezpečné)
Alphard
Profil
Neměla by být šifra dešifrovatelná? To, co uvádíte bych nazval hashem. Hashe se sice využívají i pro snažší porovnání, prosté md5 nebo sha1 budiž, ale to vaše solení se mi zdá zbytečně znepřehledňující, takže na škodu trošku možná i je.

midlan:
Žádné šifrování bych nevymýšlel, jednoduše implementovat pomocí sessions. Konkrétní implementace závisí třeba i na tom, jestli chcete umožnit změnu obrázku, ale v zásadě bude podobná whoami [#5], jen bych to nehashoval. Zkušebně jsem zkusil najít nějaká hotová řešení a existuje hromada návodů včetně funkcí generujících obrázek.

Pokud chcete něco dokonalejšího, co dokáže třeba i přečíst znaky pro handicapované, můžete použít hotové řešení, třeba recaptcha apod.
whoami
Profil
Alphard:
jestli chcete umožnit změnu obrázku
Stačí přidat <a href="javascript:void(0);" onclick="<!-- refresh obrázku pomocí js (pravděpodobně s ?rnd=XYZ kvůli cache) -->" title="">Jiný obrázek</a>
Neměla by být šifra dešifrovatelná?
A proč by měla..? Ta captcha je úplně stejná věc jako heslo.. Do db ho ukládám jako hash a i když nedokážu určit původnní podobu, dokážu ověřit, jestli ho uživatel zadal správně.. Dokonce to, že nelze zjistit původní podoba, dělá aplikaci bezpečnější..
Alphard
Profil
whoami:
A proč by měla..?
Vy mi nerozumíte, mně šlo o pojmy. Jestli lze jednosměrnou funkci nazývat šifrou. Ale to jsem psal jen tak na okraj, hlavně mi šlo o druhou část příspěvku, upozornit autora, že existuje i hodně hotových kódů, protože se mi zdálo, že je ani nezkoušel hledat.
whoami
Profil
Alphard:
Ano, chápu rozdíl mezi pojmem šifra a hash... Tím „A proč by měla..?“ jsem se snažil naznačit, že pro tuto aplikaci je bezpečnější a vhodnější použít hash.. A samozřejmě pro většinu aplikací je hotové řešení..
midlan
Profil
Žádné šifrování bych nevymýšlel
Taky to tak vidím, stejně se k textu nikdo nedostane.

Alphard:
upozornit autora, že existuje i hodně hotových kódů
Ano to vím, na internetu je toho spoustu a pak captchy od googlu a seznamu. Mám radši ale vlastní řešení navíc tohle není nic složitého.

Všem děkuji, použiju sessions.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: