Newsgroup: it.comp.www.php
Titolo: Prima di salvare una password

Ciao ragazzi
vorrei essere sicuro di non sbagliare nel salvare una password criptata ed 
escapata.
Poco prima della query già col database aperto cripto la password e la 
password criptata viene escapata da mysql_real_escape_string()
$password=mysql_real_escape_string(sha1(
$_POST['password']));
E' giusto o è meglio criptarla dopo aver eseguito mysql_real_escape_string() 
sapendo che il campo del database ha 40 caratteri ovvero la lunghezza di una 
stringa sha1()?
ovvero:
$password=sha1(mysql_real_escape_string(
$_POST['password']));

 caratteri ovvero la lunghezza di una stringa sha1()?
L'escaping va applicato come ultima cosa prima di utilizzare il valore
in una query.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 in una query.
ma perchè, sha crea stringhe che hanno bisogno di essere escapate?
mi sembrava di no...

 ha scritto nel messaggio 
news:pan.2008.06.20....@inwind.it...

Il mio dubbio era anche che
sha1  le escappasse pure

RedWiz ha scritto:

Dipende se utilizzi il formato esadecimale o quello raw.
In generale l'escaping e' sempre l'ultima operazione da eseguire.


 In generale l'escaping e' sempre l'ultima operazione da eseguire.
sì su quello non ci piove


Aspetto che ti documenti meglio
Io non ho trovato altro 

 Io non ho trovato altro
in effetti è bastato leggere il manuale, se si specifica il parametro
opzionale $raw allora il digest non è + una stringa HEX (la quale non ha
bisogno di essere escapata) ma un binario , che in teoria puo' essere
composto da qualsiasi carattere. In ogni caso, usa la funzione senza
parametri, non escapare niente e vivi felice :)

 parametri, non escapare niente e vivi felice :)
Tempo fa Quando parlai di escapare la password dissi che io evitavo già che 
fossero inseriti caratteri indesiderati nel form attraversio la validazione 
in javascript quindi è già difficile che giungano caratteri indesiderati 
alla funzione php di salvataggio password ma mi fu risposto che non era un 
metodo sicuro-

 mi fu risposto che non era un metodo sicuro-
Un attaccante puo' bypassare javascript facilmente, ecco perche'
affidarsi alla validazione lato client non garantisce sicurezza.



mi stai dicendo che una password ashata con sha1() non č in realtą criptata 
e qiondi non č sicuro usarla per inserire passwords in una tabella di 
passwords mysql ma che devo anche criptarla?

 tabella di passwords mysql ma che devo anche criptarla?
No, sto dicendo che "sha NON e' un algoritmo di criptazione, e' un
algorithmo di hashing".
Se non conosci la differenza, ti suggerisco di leggere 
http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Encryption


 passwords mysql ma che devo anche criptarla?
No. "Algoritmo di hashing" vuol dire che da una data stringa (i.e. la
password), tu ottieni un hash (i.e. quello che salvi in database). In
particolare, SHA (come MD5), è un algoritmo di hashing "one-way": da un testo
in chiaro ottieni un hash, ma da un hash non puoi ottenere il testo in chiaro.
Un "algoritmo di cifratura" (o criptazione), invece, _prevede_ un "algoritmo di
decifratura" (o decrittazione).
Il discorso comunque non è così semplice, ma penso possa bastarti :)
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 
http://en.wikipedia.org/wiki/Encryption
OK!
ma tu mi consigli di salvare le password usando solo sha1()?
$pass=sha1(input_dell_utente)
o di fare anche qualche cos'altro prima di salvarla?
Cosa esattamente?
Grazie e scusa per l'insistenza ma devo essere sicuro di quello che faccio

 Grazie e scusa per l'insistenza ma devo essere sicuro di quello che faccio
Basta usare solo sha1 :) E nessuno potrà risalire alla password originale.
Ti è stato detto che non è criptata per una questione di 
interpretazione: criptato significa "nascosto" e quindi *letteralmente* 
la password è criptata, solo che in informatica si parla di crittazione 
quando è possibile risalire all'originale attraverso un algoritmo che 
previede ulteriori chiavi, altrimenti si parla di hash.
Quindi in linea di massima è più sicuro fare un hash.
-- 
  Giovanni Cappellini - 
http://quacos.wordpress.com
Realizzazione siti dinamici e consulenze OpenSource:
 
http://www.weblogix.biz

 
sha non è semplicemente un algoritmo di hash
http://en.wikipedia.org/wiki/Cryptographic_hash_functions
http://en.wikipedia.org/wiki/Cryptography
Cryptographic hash functions (often called message digest functions) do not
necessarily use keys, but are a related and important class of
cryptographic algorithms.

 sha non è semplicemente un algoritmo di hash
Hai ragione, e' un sicuro algoritmo di hash (Secure Hash Algorithm).


 
http://en.wikipedia.org/wiki/Cryptographic_hash_functions
SHA non e` nemmeno una cryptographic hash function, come si legge da 
quella stessa pagina, o almeno non e` sicura:
A cryptographic hash function is considered insecure if either of the 
following is computationally feasible:
    * finding a (previously unseen) message that matches a given digest
    * finding "collisions", wherein two different messages have the same 
message digest.
...
In February 2005, an attack on SHA-1 was reported, finding collisions in 
about 2^69 hashing operations, rather than the 2^80 expected for a 160-
bit hash function. In August 2005, another attack on SHA-1 was reported, 
finding collisions in 2^63 operations.
Il poterla usare come funzione per la crittografia di una password e` un 
effetto secondario del fatto che sia una funzione di hashing ma, come 
gia` detto, una vera funzione crittografica deve essere invertibile, 
mentre le funzioni di hashing non lo sono mai.
Tra l'altro, per essere veramente sicura, deve essere applicata a 
password relativamente lunghe, perche` se sono troppo corte (3-4 
caratteri, per esempio) sono piu` soggette a collisioni.
Bye.

 caratteri, per esempio) sono piu` soggette a collisioni.
Solitamente suggerisco di eseguire l'hash delle password facendo
l'append di una string secret tipo quella generata da
http://api.wordpress.org/secret-key/1.0/
.
In questo modo l'efficacia degli attacchi basati su database come
http://gdataonline.com/
 viene sensibilmente ridotta.


 caratteri, per esempio) sono piu` soggette a collisioni.
questo è ovvio

Paolo ha scritto:

Giusto; però, secondo me, se tu ti limiti ad applicare sha1($pass) non 
dovresti avere nessun problema, abcge senza escape (e, in questo caso, 
non vedo neanche la necessità di impedire l'inserimento di caratteri 
particolari). Attenzione, perché se invece passi, anche una sola volta, 
$pass ( e non sha1($pass)) al comando sql, allora va escapato.
O sbaglio?