php - password - laravel 4.2 consultas con una columna encriptada
sha laravel (2)
Actualmente tengo este código en mi controlador que muestra un conjunto de registros aquí está mi código
public function view()
{
$title = "View Guardian Information";
$vPa = DB::table(''dbo_guardianinformation'')
->join(''dbo_cities'', ''dbo_guardianinformation.CityID'', ''='' , ''dbo_cities.CityID'')
->select(''dbo_guardianinformation.ParentAccountID'',''dbo_guardianinformation.FirstName'',''dbo_guardianinformation.LastName'',''dbo_guardianinformation.Roles'',
''dbo_guardianinformation.Address'',''dbo_cities.CityName'',''dbo_guardianinformation.Status'',''dbo_guardianinformation.EmailAddress'')
->get();
//encrypt decrypt algo
// $sptkey = md5(''sample_encryptkey'');
// $enPass = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sptkey, $defPass, MCRYPT_MODE_ECB)));
// $decPass = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sptkey, base64_decode($enPass), MCRYPT_MODE_ECB));
return View::make(''ssims.view_parentAccount'',compact(''title'',''vPa''));
}
mi problema es que la columna dbo_guardianinformation.Address
contiene registros encriptados que actualmente no tengo idea de dónde debería poner el código de descifrado para que cuando $vPa
se pase a la vista ya contenga los registros descifrados. ¿algunas ideas? gracias a cualquiera que pueda ayudar
Indexar datos encriptados
Si necesita buscar una columna cifrada en una base de datos SQL rápida y eficientemente, necesita construir un índice oculto de los datos (es decir, almacenar hash_hmac(''sha256'', $plaintext, $separate_key_here)
en una columna adicional) y estructurar su selección consultas basadas en eso. (El artículo vinculado explica los requisitos de seguridad).
Esto le ahorra tener que hacer un bucle foreach()
pero, dado que se usa HMAC-SHA256, es increíblemente improbable que un atacante con acceso a la base de datos pueda extraer el texto sin formato del sistema.
Dicho esto, hay algo más que me gustaría abordar:
Criptografía Débil
Por favor, no use el código de encriptación que incluyó en su pregunta. Es muy inseguro. Laravel tiene su propia clase de encriptación ; por favor use eso en su lugar. Hace muchas cosas bien que el fragmento de código que incluyó no lo hace. Por ejemplo: proporciona cifrado autenticado .
$sptkey = md5(''sample_encryptkey'');
Si desea un poco de seguridad en su aplicación, nunca use md5($string)
para generar una clave. Esta es solo una mala idea:
-
md5()
devuelve una cadena hexadecimal de 32 caracteres - La mayoría de las funciones de cifrado esperan una cadena binaria en bruto
- MD5 es una función hash increíblemente rota
- Para transformar una contraseña en una clave de encriptación, debe usar una función de derivación de clave, es decir, P contraseña: F unción de falsación de KEY con la clave SHA-256 (PBKDF2-SHA256).
Considere, por ejemplo, este código en su lugar:
define(''MY_APP_PBKDF2_ITERATIONS'', 86000);
define(''MY_APP_KEY_LENGTH'', 32); // or 16 for AES-128
// ...
$sptkey = hash_pbkdf2(
''sha256'',
$your_password,
$salt, // 32 bytes from /dev/urandom
MY_APP_PBKDF2_ITERATIONS,
MY_APP_KEY_LENGTH,
true
);
Expandí el espacio en blanco aquí y dejé algunos comentarios en línea a continuación:
$enPass = rtrim( // Unnecessary, base64_encode doesn''t leave whitespace
base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256, // This isn''t AES-256 by the way
$sptkey,
$defPass,
MCRYPT_MODE_ECB // ECB mode is the worst mode
)
)
);
$decPass = rtrim( // Padding oracle attack
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$sptkey,
base64_decode($enPass), // No error checking
MCRYPT_MODE_ECB
)
);
Lectura adicional sobre los problemas específicos:
Qué hacer en su lugar (elija uno):
- Usa las funciones de encriptación de Laravel , ya que estás usando Laravel.
- Use libsodium (altamente recomendado)
- Usar la clase de cifrado PHP de Defuse Security
- Cuando Halite golpea 1.0.0, cambia a eso (es básicamente libsodium para principiantes)
Resulta que con un pequeño retoque y la ayuda de João Mendes tuve el código como este
public function view()
{
$title = "View Guardian Information";
$vPa = DB::table(''dbo_guardianinformation'')
->join(''dbo_cities'', ''dbo_guardianinformation.CityID'', ''='' , ''dbo_cities.CityID'')
->select(''dbo_guardianinformation.ParentAccountID'',''dbo_guardianinformation.FirstName'',''dbo_guardianinformation.LastName'',''dbo_guardianinformation.Roles'',
''dbo_guardianinformation.Address'',''dbo_cities.CityName'',''dbo_guardianinformation.Status'',''dbo_guardianinformation.EmailAddress'')
->get();
foreach ($vPa as $key => $dvPa)
{
$sptkey = md5(''this is secret'');
$enAdd = $dvPa->Address;
$decAdd = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sptkey, base64_decode($enAdd), MCRYPT_MODE_ECB));
$dvPa->Address = $decAdd;
}
return View::make(''ssims.view_parentAccount'',compact(''title'',''vPa''));
}