2012-02-12 42 views
5

Estoy tratando de crear un sitio web con una función de inicio de sesión/cierre de sesión y planeo encargar y clasificar la contraseña correctamente. Sin embargo, el problema al que me estoy enfrentando es cómo almacenar la contraseña en la base de datos. Sé que necesito almacenar la contraseña hashed + salada en la base de datos (no en texto plano o cifrado simple), pero no sé cómo resolver técnicamente la inserción de datos binarios en la base de datos.¿Cómo puedo almacenar un hash en una base de datos de SQL Server usando C#?

En mis primeros intentos, la única forma de obtener datos en la base de datos era convertir los datos binarios en una cadena base64 e insertarlos en el campo de contraseña varchar, pero algo me dice que esa no es la forma correcta para hacerlo.

El campo de la contraseña en la base de datos es actualmente un varchar pero como yo lo entiendo, un hash de la contraseña es binario. Así que incluso si cambié el campo de contraseña a un objeto binario, todavía no sé cómo para insertarlo realmente!

Si no estoy haciendo ningún sentido favor pedir una aclaración y me pondré en contacto con usted.

+1

El hash puede ser un varchar ... que no tiene que ser binarios en absoluto, sino por curiosidad ¿Cuál es la función ha que está utilizando? – hackartist

+1

¿Por qué no quieres usar base64? Es simple y los datos son lo suficientemente pequeños como para no preocuparse por el tamaño. –

+0

Base64 es la forma más segura que deja el hash en forma humana legible. No hay nada de malo en almacenar un hash salado como texto plano; ese es el propósito detrás de almacenar un hash, no una contraseña. – Douglas

Respuesta

3

No, un duerma hash de la contraseña tienen que ser almacenados en un campo varbinary, puede codificar y almacenarlo en un campo varchar. Base64 es una buena alternativa para codificar cualquier tipo de caracteres.

+2

¿Qué tipo de hash usas para generar cadenas y no secuencias de picaduras? Todas las funciones criptográficas que conozco generarán un número determinado de bits como 128, 160, 256 o 512 bits y eso no es una cadena (las cadenas se almacenan usando una codificación). –

+0

@MartinLiversage He utilizado hash MD5 para almacenar contraseñas en varios campos sin problemas. Linux usó hash MD5 en/etc/passwords durante mucho tiempo. El punto es que NO TIENES que almacenarlos en un campo varbinary. – Icarus

+1

Por supuesto, puede almacenar hashes en columnas 'varchar', pero luego debe codificarlos usando algo como la codificación base64. Su respuesta parece indicar que el hash se puede almacenar directamente sin tener en cuenta secuencias binarias aleatorias que no tienen sentido en una cadena. –

6

En Microsoft SQL Server puede almacenar datos binarios en columnas que tengan un tipo de datos binary (o varbinary si necesita datos de longitud variable). Puedes usar eso para tus contraseñas hashed y saladas. Si utiliza una función hash de 512 bits y también desea utilizar una sal de 512 bits, necesita 2 * 512/8 = 128 bytes (por ejemplo, binary(128) para almacenar sal y hash.

Normalmente, cualquiera que sea la API que utilice para leer y escribir base de datos que debe ayudar en la lectura y escritura de datos binarios Sin embargo, tal vez desee utilizar alguna de SQL para insertar directamente un valor binario en una tabla puede utilizar la sintaxis de la siguiente manera:..

insert into MyTable values (0x123456789ABCDEF) 
No

realmente una respuesta a su pregunta, pero si tiene dificultades para implementar su propia función de contraseña, podría considerar usar un componente de resistencia industrial preconstruido para evitar avergonzar errores en el futuro. ASP.NET has a membership provider por ejemplo.

Cuestiones relacionadas