salted - Hash de contraseñas en una aplicación de Windows C#, ausente FormsAuthentication de ASP.NET?
salt password hash (6)
FormsAuthentication se define en el espacio de nombres System.Web.Security que se encuentra en el ensamblado System.Web.dll.
El hecho de que esté escribiendo una aplicación WinForm no le impide usar ese espacio de nombres o hacer referencia a ese ensamblaje; simplemente no están hechos por defecto como lo serían para una aplicación WebForms.
A mi aplicación Win Form no parece gustarle FormsAuthentication, soy totalmente nuevo en hash así que cualquier ayuda para convertir esto sería muy bienvenida. Gracias.
//Write hash
protected TextBox tbPassword;
protected Literal liHashedPassword;
{
string strHashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(tbPassword.Text, "sha1");
liHashedPassword.Text = "Hashed Password is: " + strHashedPassword;
}
//read hash
string strUserInputtedHashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile( tbPassword.Text, "sha1");
if(strUserInputtedHashedPassword == GetUsersHashedPasswordUsingUserName(tbUserName.Text))
{
// sign-in successful
}
else
{
// sign-in failed
}
Creo que debería funcionar. Todo lo que necesita hacer es hacer referencia a System.Web.Security en su código (y agregarlo como referencia en su proyecto de Visual Studio).
Si realmente tiene que ''enviar'' esta aplicación de formularios, quizás agregar System.Web.Security no sea una buena idea ...
Si necesita un hash SHA1, hay una biblioteca de criptografía .net muy fácil de usar con ejemplos en msdn. La clave es
- toma lo que quieras encriptar
- conviértalo en bytes para cualquier codificación (ascii, utf *) que estés usando
- Utilice uno de los muchos esquemas hash integrados a .Net para obtener los bytes hash
- convierte esos bytes de nuevo en una cadena con la misma codificación que en el paso 2
- Guarde la cadena hash resultante en algún lugar para una comparación posterior
//step 1 and 2
byte[] data = System.Text.Encoding.Unicode.GetBytes(tbPassword.Text,);
byte[] result;
//step 3
SHA1 sha = new SHA1CryptoServiceProvider();
result = sha.ComputeHash(data);
//step 4
string storableHashResult = System.Text.Encoding.Unicode.ToString(result);
//step 5
// add your code here
¿No podría usar la función BitConverter en lugar del bucle "x2"?
p.ej
devuelve BitConverter.ToString (hash) .Replace ("-", "");
using System.Security.Cryptography;
public static string EncodePasswordToBase64(string password)
{ byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes);
return Convert.ToBase64String(inArray);
}
Si está utilizando el hashing para las credenciales de usuario, le sugiero que haga algo más que solo hash, idealmente también desea un key stretch.
Aquí hay una API para hacer lo que quieras de forma segura: