¿Hay algún beneficio en los códigos de hashing y los números de cuenta?

1

Tenemos una base de datos de códigos de clasificación (números de 6 dígitos) y números de cuenta (números de 8 dígitos) que utilizamos para conciliar las cuentas mensuales con la tabla de partidarios.

No hay nada en los datos recibidos del banco que identifique de forma única al partidario, aparte del código de clasificación y el número de cuenta. ... Lo sé, es molesto.

Si bien estos datos no son tan sensibles como los datos de la tarjeta (y no sujeto a PCI-DSS ), sigue siendo bastante delicado y me gustaría encontrar otra forma de hacer la conciliación para reducir la responsabilidad de tener todos estos datos.

La combinación del código de clasificación y el número de cuenta ofrece hasta 10 ^ 14 posibilidades.

¿Hay una manera (usando una función de PHP confiable y establecida) para hacer un hash de los datos y solo almacenar el hash, que me permita tomar un archivo mensual de -say- 1000 registros y hacerlos coincidir con los ¿hash datos? ¿O realmente no tiene sentido y en su lugar se enfoca en reforzar la seguridad en torno a esta db?

La ventaja de seguridad que estoy buscando es que la base de datos no tiene una lista de datos bancarios lista para usar. Los datos del extracto bancario mensual transaccional pueden considerarse de corta duración (se reciben encriptados, descifrados, procesados, eliminados).

He leído una comparación detallada útil de funciones de hashing pero obviamente aquí no estamos hablando de contraseña ¡Y, en efecto, necesitamos poder descifrarlos cada mes! Hmmm.

EDITAR: Conclusión

Gracias a las respuestas a continuación, esto es lo que planeo hacer:

Configuración

  1. Cree un mapa para los códigos de clasificación y los números de cuenta para usuarios aleatorios .
  2. Reemplazar datos reales con datos asignados.
  3. Cifre este mapa utilizando Mcrypt AES 256 de PHP con una clave proporcionada por el usuario nunca almacenada en el servidor
  4. Almacene el mapa cifrado en el servidor.

Ahora: puede tomar la base de datos, no puede obtener los datos, o cualquier forma de descifrarlos mediante la fuerza bruta, gracias al mapa aleatorio.

También puedes tomar el mapa y descubrir cómo funciona (sin depender de la oscuridad), pero aún así debes poder descifrar el cifrado para acceder al mapa. Esto se siente como un nivel adecuado de riesgo.

Reconciliación

  1. Descifre el contenido PGP del banco localmente.
  2. Sobre SSL, cargue las transacciones del mes y también proporcione la clave de descifrado.
  3. El servidor descifra el mapa, lo aplica a los datos cargados, almacena los datos asignados para su procesamiento posterior, elimina el archivo cargado sin procesar.
  4. El usuario elimina los datos bancarios descifrados localmente.

Esto significa que la clave y el mapa descifrado solo están siempre en la RAM. Las transacciones del mes se almacenan temporalmente en el disco, pero ese es un nivel aceptable de riesgo IMO (podría usar un método de eliminación seguro como bleachbit, etc.).

Actualizar la clave es tan simple como proporcionar claves existentes y nuevas, descifrar mapa, cifrar mapa, almacenar mapa.

Si existe la preocupación de que el mapa descifrado se haya visto comprometido, esto también podría reconstruirse, aunque es un esfuerzo mayor, ya que significa actualizar todos los datos almacenados.

    
pregunta artfulrobot 03.02.2015 - 18:44
fuente

2 respuestas

3

Tenga cuidado con las cosas de hash en las que las personas podrían determinar las características de la entrada. Una empresa usó el MD5 de los ID de los taxis para anonimizar, lo que se invirtió rápidamente. Sí, podría Prueba alguna modificación de hash casera que la haría menos obvia que solo un MD5 directo, pero eso es seguridad a través de la oscuridad. Solución de problemas casi cualquier función de hashing por cada número de cuenta de 8 dígitos es trivial, momento en el que sus datos son tan buenos como el de texto simple. La concatenación de los números de cuenta con el código de clasificación no será mucho mejor.

Lo que debes hacer en su lugar es hacer una tabla / programa / lo que sea que asigne tus datos confidenciales a IDs aleatorios. Su sistema requeriría acceso a esa tabla / programa para realizar la conversión, puede tomar medidas para asegurar esa tabla / programa (como almacenarlo en un volumen de TrueCrypt) mientras trabaja con datos verdaderamente anónimos.

    
respondido por el Aron Foster 04.02.2015 - 00:21
fuente
1

Si considera que los números de las cuentas bancarias son confidenciales, sí, vale la pena incluirlos.

Cuando hablamos de hash, siempre deberíamos hablar de poner sal en el hash. En este caso, sería computacionalmente costoso que usted elimine cada hash por separado, que es el enfoque con el que siempre debe comenzar.

Cuando intente usar esto como un valor de búsqueda basado en el texto sin formato (número de cuenta bancaria + código de clasificación) si saldeaba cada fila individualmente, tendría que calcular el hash de cada fila recibida usando la sal de Cada registro individual. Esto ralentizaría el proceso de O (log (n)) a O (n), donde n es el número de registros que está almacenando.

Por lo tanto, recomendaría tener una sal en todas las cuentas bancarias, esto evitará que se usen tablas arco iris en general para revertir su hash, pero no evitará que alguien cree una tabla arco iris específica para su aplicación. Entonces, ¿qué se necesita para almacenar una tabla de arco iris para todos los números de cuenta posibles?

Hay 10 ^ 8 números de cuenta posibles y 10 ^ 6 códigos de ordenación posibles que dan 10^14 posible (número de cuenta + sortcodes). SHA-1 requiere 20 bytes para almacenar, por lo que almacenar todos los hashs posibles para todos los posibles bankccount + sortcodes tomar 20*10^14 bytes que es 1819 Terabytes (TiB). Así que parece que crear una tabla de arco iris para revertir todo hash no sería factible. SHA-256 requeriría 2910 TiB.

Vale la pena señalar que esto será reservable para cualquier persona con suficiente poder de cómputo, basado en SHA-256 y la velocidad aquí enumerados tomaría aproximadamente 80 días una sola computadora central para agrupar todas las combinaciones de código de clasificación / número de cuenta. Con una parte superior de la línea de escritorio moderno, supongo que esto podría reducirse a días de un solo dígito. Si esto le preocupa, puede pasar a una función hash más lenta como PBKDF2 ( vea también ) que luego puede configurar para que se ejecute tan lento como desee.

Recomendación

Recomendaría hacer hashing de estos valores usando SHA-256 o PBKDF2 y la función hash usando una semilla. Por favor vea el siguiente pseudo-código:

$salt = "A Random Long String I Did Not Copy From The Internet"
$iterations = 10000 // Make this number larger for the hash to be more secure/slower

function hashBankAccount($AccountAndSortCode){
    $result = hash("sha256", $salt . $AccountAndSortCode)
    // OR
    $result = hash_pbkdf2("sha256", $AccountAndSortCode, $salt, $iterations, 64);
    return $result
}

Luego puede almacenar el resultado de esta función en su base de datos.

    
respondido por el David Waters 04.02.2015 - 00:50
fuente

Lea otras preguntas en las etiquetas