2008-10-17 2 views
8

내 Win 양식 응용 프로그램이 FormsAuthentication을 좋아하지 않는 것 같습니다.이 기능을 변환하는 데 도움이 될 수 있도록 해싱을 처음 접했습니다. 감사.ASP.NET의 FormsAuthentication이 없으면 C# Windows 응용 프로그램의 암호 해시가 필요합니까?

//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 
} 
+0

사용자가 로그인 한 사용자는 다른 자격 증명을 지정할 수있는 응용 프로그램을 가지고있는 목표는 다음과 같습니다

여기에 안전한 방식으로 당신이 원하는 것을 할 수있는 API는 무엇입니까? 다른 서비스에 액세스하는 데 사용할 자격 증명을 얻으려면? 네가하려는 일을 잘 모르겠다. – tvanfosson

답변

1

나는 그것이 효과가 있다고 생각합니다. 코드에서 System.Web.Security를 ​​참조하면됩니다 (Visual Studio Project에서 참조로 추가).

3

FormsAuthentication은 System.Web.dll 어셈블리에있는 System.Web.Security 네임 스페이스에 정의되어 있습니다.

WinForm 앱을 작성한다고해서 사용자가 해당 네임 스페이스를 사용하거나 해당 어셈블리를 참조하는 것을 막을 수는 없습니다. WebForms 앱처럼 기본적으로 완료되지 않습니다. 실제로 '배'에있는 경우

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); 
} 
+1

매우 깨끗한 - 나는 두 가지 구현을 테스트했고 당신의 것이 더 빠릅니다. 100,000 반복에서 50ms가 더 빠르므로 나는 그것을 upvoting합니다 :) –

+0

SHA1은 (분명히) 빠르지 만 SHA256보다 덜 안전하다는 것을 명심하십시오 . 자세한 내용은 http://en.wikipedia.org/wiki/SHA256을 참조하십시오. –

+1

@JarrodDixon : 반대로. 암호의 경우 _slower_ 해시가 필요합니다. – SLaks

1

이있다, 당신은 SHA1 해시가 필요한 경우 어쩌면

... System.Web.Security은 좋은 생각이 아니다 추가, 응용 프로그램을 구성 아주 사용하기 쉽습니다 .net 암호화 라이브러리에 msdn 예제가 있습니다. 열쇠는

  1. 당신이
  2. 사용하려면 .NET으로 내장 많은 ​​해싱 기법 중 하나를 사용하는 중 인코딩 (ASCII, UTF *) 바이트로
  3. 차례를 암호화 할 것을 걸릴 것입니다
  4. 나중에 비교를 위해 어딘가에 2 단계
  5. 저장 결과 해시 문자열에서와 동일한 인코딩 문자열로 다시 그 바이트를 돌려
  6. 해시 바이트를 얻을

//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 
+0

명백한 "WinForms 앱을위한 것이 아닙니다"이외에 System.Web. *을 포함하는 이유는 그다지 좋은 아이디어가 아닙니다. – JasonS

+1

http://www.west-wind.com/Weblog/posts/617930에서 Rick Strahl의 게시물을 상기시켜줍니다.aspx 1. 올바른 느낌이 들지 않습니다. 2. System.Web은 라이브러리를 소비하는 모든 응용 프로그램의로드 된 assebly 목록으로 강제로드됩니다. 3. 메모리 풋 프린트에 2.5 megs를 추가합니다. 4. 기타 (실외) – Ted

1

"x2"루프 대신 BitConverter 기능을 사용할 수 있습니까?

return BitConverter.ToString (hash) .Replace ("-", "");

2

사용자 자격 증명에 해시를 사용하는 경우 해싱 그 이상을 수행하는 것이 좋습니다. 키 스트레칭을 사용하는 것이 가장 이상적입니다.

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

+0

거기에 소스 코드가 없습니다. 누구도 자신의 암호를 .DLL로 신뢰하지 않을 것입니다. –

+0

"source"라는 폴더의 파일 영역에 소스가 있습니다. 근원은 당신이 묘사하는 정확한 이유를 위해 제공됩니다. 다음은 소스 폴더 http://sourceforge.net/projects/pwdtknet/files/Source/에 대한 링크입니다. – thashiznets

관련 문제