8

我的 Win 表单应用程序似乎不喜欢 FormsAuthentication,我对散列完全陌生,因此非常欢迎任何帮助转换它。谢谢。

//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
}
4

6 回答 6

22
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);
}  
于 2008-10-17T16:16:57.650 回答
3

FormsAuthentication 是在 System.Web.dll 程序集中的 System.Web.Security 命名空间中定义的。

仅仅因为您正在编写一个 WinForm 应用程序并不会阻止您使用该命名空间或引用该程序集;它们只是默认情况下不会像 WebForms 应用程序那样完成。

于 2008-10-17T16:06:06.313 回答
2

如果您将散列用于用户凭据,我建议您做的不仅仅是散列,理想情况下您还需要密钥拉伸。

这是一个以安全方式执行您想要的操作的 API:

https://sourceforge.net/projects/pwdtknet/

于 2012-10-04T00:46:23.650 回答
1

我认为它应该工作。您需要做的就是在代码中引用 System.Web.Security(并将其添加为 Visual Studio 项目中的引用)。

于 2008-10-17T16:03:27.647 回答
1

如果您实际上必须“发布”此表单应用程序,那么添加 System.Web.Security 可能不是一个好主意...

如果您需要 SHA1 哈希,则有一个非常易于使用的 .net 密码库,其中包含 msdn 上的示例。关键是

  1. 拿走你想加密的东西
  2. 将其转换为您使用的任何编码(ascii,utf *)的字节
  3. 使用 .Net 内置的众多散列方案之一来获取散列字节
  4. 将这些字节转换回与步骤 2 相同编码的字符串
  5. 将生成的散列字符串保存在某处以供以后比较

//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
于 2008-10-17T16:22:17.297 回答
1

您不能使用 BitConverter 函数而不是“x2”循环吗?

例如

返回 BitConverter.ToString(hash).Replace("-", "");

于 2008-11-09T15:15:03.230 回答