Autor Zpráva
stuchlej
Profil
Dobrý den.
Chco se zeptat, jestli v PHP není nějaká "věc" která dokáže šifrovat text a pak ho pomocí hesla dešifrovat.
Asi nějak takhle:
Mám text v $text_pred_sifrvanim a heslo v proměné $heslo
Ta nějaká věc mi to pomocí tohodle zašifruje a zašifrovaný text se vrátí v $zasiforovany_text
Pak to chci dešifrovat.
mám tedy siforovany text v $zasiforovany_text a jako klíč použiji $heslo
Dešifrovaný text se vrátí třeba v proměné $po_desifraci
Totiž přemíšlel jsem o tom jak každému uživateli vytvořit jiné heslo, které by bylo klíčem k vlastní kopii zašifrovaného hesla k databázi (MySQL). Abych totiž nemusel opravdové heslo k databázi nikdy do kódu napsat.
Děkuji Stuchlej
Nox
Profil
jde použít mcrypt knihovnu (viz manuál)
stuchlej
Profil
Dobře jaký manuál? Pokud ten php.net tak ten mi moc nepomůže... chodím do 7 třídy ZŠ
Byl by jste tak hodný a napsal nějaký příklad? Taky používám free hosting na wz.cz
Nox
Profil
zjistit jestli to existuje pomocí phpinfo(); (pokud bude fungovat, někde je zakázané...pak by mělo být možné ho najít na webu hostingu)

moc jsem to nepoužíval, ale napíšu tu nějaký tip jak se to používá víceméně na základě příkladů z manuálu

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "Tvuj tajny klic";
$text = "To co chceš zašifrovat";

// argumenty: algoritmus, klic, co se ma sifrovat, mod, nějaká incializační hodnota... vytvoří se dle 1. a 2. řádku (v případě módu  CBC, CFB nebo OFB nebo některých streamů)
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);

MCRYPT_RIJNDAEL_256 - znamená že se bude používat 256bit verze algoritmu Rijndael, seznam zde: http://www.php.net/manual/en/mcrypt.ciphers.php a popisy algoritmů by mohly být na wikipedii nebo přes google, ale asi to bude celkem složité (stejně předpokládám že neděláš nic supertajného, takže to bude jedno)

MCRYPT_MODE_ECB - jakýsi mód šifrování:
- MCRYPT_MODE_ECB: vhodný pro krátké texty, například kódy, hesla atd.
- MCRYPT_MODE_CBC: vhodný na soubory
- MCRYPT_MODE_CFB: pro bytové streamy
další jsou spíš takové speciální

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "Tvuj tajny klic";

$desifrovane = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
stuchlej
Profil
Díky moc. Mě jde jen o to, aby si někdo heslo nepřešetl přímo z kódu. To by potom heslo ztratilo trochu víznam...
Alphard
Profil
stuchlej:
Mě jde jen o to, aby si někdo heslo nepřešetl přímo z kódu.
K tomu se používá hash.
stuchlej
Profil
Ještě jedna věc. wz.cz toto asi neposporuje protože při spuštění skriptu, který zakóduje text se napsalo toto
Fatal error: Call to undefined function: mcrypt_get_iv_size() in /3w/nazory.cz/f/federace/pokus.php on line 2
Nevíte někdo o nějakém free hstingu, který podporuje MySQL a knihovnu Mcrypt?
(Váš kód jsem nechal nezměněn až na to že jako klíč jsem dal 'ahoj', jako šifrovvany text 'bender je buh' a na poslední řádlek jsem dal příkaz echo;)
stuchlej
Profil
O hash jsem četl je pouze jednosměrný ale já potřebuji zakódovat heslo k MySQL, tak aby nebylo na očích...
Alphard
Profil
stuchlej:
ale já potřebuji zakódovat heslo k MySQL
Na FTP má přístup ještě nějaký útočník? Zajímavé :-) Běžně se nechává v konfiguračním souboru. Někte v kódu stejně musíte nechat klíč přo šifrování, takže si moc nepomůžete.

Nevíte někdo o nějakém free hstingu, který podporuje MySQL a knihovnu Mcrypt?
Možná ic.cz, ale nezaručím vám to.
mckay
Profil
stuchlej:
A proč to neuděláš nějak takto: když ukládám heslo, uložím ho v md5 a sha1
$heslo = md5(sha1("prisne_tajne_heslo"));


Když potom ověřuješ, jestli je heslo správné, uděláš to samé s přijatým heslem, a ověříš jestli se shoduje s tím v databázi.

$heslo = md5(sha1($_POST["heslo"])); // pokud přichází heslo v $_POST
$row = mysql_fetch_assoc(mysql_query("select ...")); // tady vybereš data pro uživatele který se snaží přihlásit
if($row["heslo"] != $heslo){echo "Zadal jste špatné heslo";exit;} // tady otestuješ, jestli se hesla shodují, když ne, tak uživatele vyhodíš, nebo třeba přesměruješ
Alphard
Profil
mckay:
Pochopil jsem to tak, že chce šifrovat heslo pro připojení k databázi (parametr pro mysql_connect). Tam mu hash bude skutečně na dvě věci...
mckay
Profil
mckay:
ach tak, potom jsem se snažil tedy zbytečně:D
Webonym
Profil *
Když už zde padlo slovo hash, mám dotaz. Je bezpečnější hašovat md5(sha1 nebo sha1(md5?
mckay
Profil
Webonym:
Pravděpodobně je to jedno, na itcoru, je o tom bezpečném hashi docela dobrý článek. ;-)
DoubleThink
Profil *
stuchlej:
Řešíš hlouposti.

Serverový filesystem běžných hostingů se pro účely webových aplikací považuje za bezpečný a soukromý. Je pravda, že u WZ pravděpodobně neplatí ani jedno ani druhé - alespoň pokud administrátory z doby mého hostování nenahradili vyššími formami života.

Tvou starostí by měla být jen bezpečnost skriptů. A šifrovat hesla k databázi symetrickou šifrou je blbost, pokud bys nepoužíval jako klíče třeba hesla uživatelů (tj. něco co fyzicky není na serveru). I tak - prohánět fotky svého křečka přes Triple-DES je plýtváním energií na blbosti.
Nox
Profil
Webonym:
Ani MD5 ani SHA1 nejsou žádné zázraky... pokud to řešíš až tak, je podle mě lepší použít SHA256 nebo SHA512 a řádně osolit
stuchlej
Profil
Dobrý den.
Po dlouhé době kdy mi to jelo se najednou něco stalo.
Zde je skript, později bude popis chyby.
function stext($key,$text){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
$_SESSION['ct'] = $crypttext;

}

function ustext($key,$crypttext){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$desifrovane = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
$_SESSION['uct'] = $desifrovane;
}
session_start();
include 'index.php';
stext('ahoj','Ja jsem stuchlej');
echo $_SESSION['ct'];
echo '<br>';
ustext('ahoj',$_SESSION['ct']);
echo $_SESSION['uct'];

if ( $_SESSION['uct'] == 'Ja jsem stuchlej')
echo '<br> ano';
else
echo '<br> ne';

Vypíše se toto

É9ÂýőH…ď‹A �ł®%,[ú"�ŇĐ”f�L(„\
Ja jsem stuchlej
ne



Poraďte prosím.
stuchlej
Profil
Vyřešeno.
Do funkce jsem přidal regulérní výraz.
Funkce vypadá takto:

function ustext($key,$crypttext){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
$rv = '[a-zA-Z0-9 ]*';
if (!@ereg($rv, $text, $zu))
echo 'error Chyba v dekodovani';
$_SESSION['uct'] = $zu['0'];
}

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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