Domanda

Sto usando sha256 per crittografare la password.Posso salvare la password crittografata sha256 in mysql.Ma non riesco ad accedere con la stessa clausola.

Inserire codice:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";

Seleziona il codice:

<?php 
error_reporting(E_ALL ^ E_NOTICE);

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
    //get user input
    $username = $_POST['username'];
    $ppasscode = $_POST['ppasscode'];
    //$passcodeen = hash('sha256', $ppasscode);
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
    //get session value from mysql
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());

C'è qualcosa di sbagliato?Sono molto confuso.Grazie.

È stato utile?

Soluzione

Potrebbe essere un errore di battitura?(due P nel codice di accesso, previste?)

$_POST['ppasscode'];

Mi assicurerei e farei:

print_r($_POST);

e assicurati che i dati siano accurati lì, quindi fai eco a come dovrebbe apparire:

echo hash('sha256', $_POST['ppasscode']);

Confronta questo output con quello che hai nel database (manualmente).In questo modo stai esplorando i tuoi possibili punti di fallimento:

  1. Ottenere la password dal modulo
  2. hashing della password
  3. password memorizzata
  4. confronto tra i due.

Altri suggerimenti

Prima di tutto, sha256 è un algoritmo di hashing, non un tipo di crittografia. Una crittografia richiederebbe avere un modo per decifrare le informazioni al suo valore originale (collisioni a parte).

Guardando il codice, sembra che dovrebbe funzionare se si sta fornendo il parametro corretto.

  • Provare a utilizzare una stringa letterale nel codice prima, e verificarne la validità, invece di utilizzare la variabile $_POST[]

  • Provare a spostare il confronto dal query di database al codice (ottenere l'hash per l'utente dato e confrontare con l'hash che avete appena calcolato)

Ma soprattutto prima di distribuire questo in qualsiasi tipo di moda pubblica, ricordatevi di disinfettare gli ingressi. Non permettere SQL arbitrario da inserire nella query. L'idea migliore qui sarebbe quella di utilizzare query con parametri.

Si dovrebbe usare l'hashing Adaptive come http://en.wikipedia.org/wiki/Bcrypt per il fissaggio delle password

La prima cosa è fare una confronto delle funzioni di SHA e optare per l'algoritmo più sicuro che supporta il linguaggio di programmazione (PHP).

Poi si può masticare la documentazione ufficiale per implementare la funzione hash() che riceve come argomento l'algoritmo di hash che avete scelto e la password prima.

sha256 => 64 bits sha384 => 96 bits sha512 => 128 bits

Il più sicuro l'algoritmo di hash è, maggiore è il costo in termini di hashing e tempo per recuperare il valore originale dal lato server.

$hashedPassword = hash('sha256', $password);

Un modo migliore soluzione è quella di utilizzare solo lo script di compatibilità eccellente da Anthony Ferrara:

https://github.com/ircmaxell/password_compat

, e anche, durante il controllo della password, aggiungere sempre un modo (preferibly asincrono, in modo che non influisce il processo di controllo per gli attacchi timming) per aggiornare l'hash, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top