2010-02-16 16 views
7

Estoy desarrollando una nueva aplicación web usando .NET 3.5 y SQL Server 2008 que necesitarán almacenar algunos Números de Seguridad Social. He estado haciendo una lectura inicial sobre el cifrado de la base de datos y es un poco confuso.¿Cuál es la mejor manera de cifrar los SSN en SQL Server 2008?

Sería bueno encriptar los SSN usando una clave asimétrica, ya que de esa manera la aplicación pública no podría recuperar ninguno de los datos una vez que haya sido encriptado. Estaba pensando que solo la interfaz de administrador sería capaz de descifrar y mostrar los datos. Pero parece que SQL Server solo protege los datos con una clave simétrica.

Entonces, ¿cuál es la mejor manera de cifrar los SSN en SQL Server 2008? Puntos de bonificación si enlaza con un buen tutorial o dos.

+2

¿Está seguro ** de que necesita almacenar SSN? ¿De verdad quieres esta responsabilidad legal masiva sobre tus hombros? – ceejayoz

+1

Estoy haciendo lo mejor que no puedo. Pero este será un sistema de inscripción abierta de beneficios, y si agrega un nuevo dependiente, se requiere información del SSN. –

+1

Eso tiene sentido. Solo me aseguro de que no sea una situación en la que algo como los últimos cuatro dígitos o un hash de una sola dirección sea suficiente. – ceejayoz

Respuesta

1

Realmente no desea utilizar el cifrado asimétrico porque es muy lento. En su lugar, querrá proteger una clave simétrica con una clave asimétrica, y luego tenga a mano la clave simétrica. Para ser sincero, me quedaría con lo que hay en SQL Server en lugar de diseñar cosas tú mismo. Un buen comienzo es aquí http://dotnetslackers.com/articles/sql/IntroductionToSQLServerEncryptionAndSymmetricKeyEncryptionTutorial.aspx

+0

Creo que entiendo la razón para hacerlo si tiene una gran cantidad de datos para encriptar. Supongo que cada pieza de datos tendría su propia clave simétrica que luego sería encriptada por la clave pública compartida, ¿verdad? Pero en este caso, ¿no serían los SSN más pequeños que las claves simétricas? –

5

Si cifra datos, entonces debe preguntarse quién lo descifrará. Si usa un sistema de cifrado asimétrico (por ejemplo, RSA), el cifrado utiliza la clave pública y el descifrado usa la clave privada correspondiente; La "asimetría" proviene del hecho de que la clave privada no puede ser recalculada desde la clave pública (aunque ambas claves están unidas matemáticamente).

La encriptación asimétrica tiende a tener una sobrecarga. Una primera observación es que dicha encriptación debe tener alguna parte aleatoria, porque todo el mundo puede encriptar (la clave pública es, sí, pública): si el proceso de encriptación es determinista, entonces cualquiera puede encriptar todos los posibles SSN (hay menos de un mil millones de ellos, que es un número realmente pequeño para una computadora moderna) y coinciden con los valores encriptados. Por lo tanto, debe haber algo aleatorio agregado durante el cifrado, y el SSN encriptado es más grande que el SSN de texto simple.

Los sistemas de encriptación asimétricos conocidos utilizan estructuras matemáticas que tienen su propio costo. Básicamente, para el sistema de encriptación RSA, con una clave "suficientemente fuerte", un mensaje encriptado tendrá una longitud de al menos 128 bytes. Algunos sistemas de encriptación funcionan mejor; aunque me apegue a los caminos trillados de la investigación académica, podría hacerlo en 41 bytes más o menos (con El-Gamal sobre la curva elíptica NIST K-163). Más pequeño parece más duro.

Por lo tanto, no es de extrañar que un sistema de base de datos dado no incluya dicha función de forma predeterminada.

para su problema, primero debe definir (y escribir), tan claramente como sea posible:

  • lo son los datos que desea proteger
  • que introduce los datos
  • que es se supone que debe leer los datos

y luego solo debe usted preguntarse si el cifrado es una herramienta adecuada para eso. El cifrado es bueno cuando el atacante previsto puede tener acceso a los datos sin procesar y almacenados. Esto significa que el atacante ha pasado por alto las protecciones del sistema operativo. En ese momento, sea lo que sea que sepa el sistema operativo, el atacante también lo sabe. Si la base de datos está alojada en una máquina y hay una interfaz a través de la cual se puede obtener el SSN descifrado, entonces esa máquina "sabe" cómo obtener los datos, y también lo hace el atacante ... Por otro lado, si el host el sistema operativo de la máquina se considera lo suficientemente resistente, entonces el cifrado no parece ser necesario en absoluto.

El cifrado simétrico en la base de datos puede solucionar un problema más débil, en el que el atacante obtiene una copia del disco duro después. El sistema host conoce la clave de encriptación simétrica, pero solo la conoce en RAM. Un atacante que robe el disco duro no tendrá esa clave.

+0

Para abordar el segundo párrafo, salar el SSN parece una buena idea. En cuanto al quinto párrafo: los datos que deseo proteger es el SSN. Los usuarios ingresarán los datos, pero no los recuperarán. Solo los administradores que usan una aplicación diferente podrán leer los datos nuevamente. En cuanto al segundo párrafo, hay todo tipo de vulnerabilidades de seguridad que aparecen con sistemas que no requieren necesariamente que el atacante tenga acceso físico a la máquina. En cualquier caso, la clave privada no se almacenaría en el mismo servidor. –

1

Si debe almacenar SSN y desea que se cifren, le recomiendo usar un mecanismo de cifrado de clave simétrica como 3DES o AES. Haga que la clave de encriptación sea una derivación de una frase de paso que solo los autorizados para acceder a los datos conocen y que deben ingresar cada vez que acceden a los datos.

Ex: (10+ Character Pass Phrase) -> SHA-1 => KEY.

No se moleste confiando en la propia base de datos para realizar el cifrado (aunque sin duda mirar en características como TDE o cualquier sistema operativo anfitrión ejecuta soporte para el disco completo o cifrado de archivos como secundaria sobre -todo el mecanismo de seguridad), más bien use las criptobibliotecas de .NET integradas y cualquier lenguaje de programación que esté usando para leer y escribir en el DB.

Esto le da la ventaja de que no tiene que almacenar una clave pública y privada o generar esas claves (que es computacionalmente costosa) y son relativamente grandes para que el almacenamiento sea más caro (relativamente), también no Tengo que preocuparme de que la clave se vea comprometida cuando un usuario no autorizado obtiene acceso a la máquina que ejecuta el código (excluyendo los ataques MITM que ocurren cuando un usuario ingresa la frase de contraseña). En segundo lugar, garantiza que, cuando se acceda, la única forma en que se puede descifrar es mediante un usuario autorizado (conoce la contraseña). Dependiendo de su presupuesto (tiempo, esfuerzo, recursos), puede agregar autenticación de múltiples factores donde la clave de cifrado se deriva tanto de una frase de contraseña como de un token que los usuarios autorizados podrían tener como una tarjeta inteligente. En tercer lugar, encriptar y descifrar los datos usando un algoritmo de cifrado de clave simétrica será mucho más rápido.

+0

Con una clave simétrica, ¿no necesita la frase de contraseña para encriptar los datos? Me haría más cómodo no tener nada que pueda usarse para descifrar los datos en el lado público de las cosas. –

+0

Supuse que no tendría una API o mecanismo para descifrar esos datos, excepto desde el lado controlado cuando un usuario autorizado está accediendo a su sistema. –

+0

Depende de lo que quiera decir con un usuario autorizado. Todas estas cosas ya deberían estar protegidas por los controles de acceso al proceso almacenados normales, por ejemplo. Quiero un nivel extra de seguridad. –

Cuestiones relacionadas