2012-01-29 3 views
29

중요한 데이터를 Windows 8의 로컬 파일에 저장하는 가장 좋은 방법은 무엇입니까? oAuth 토큰/암호를 저장해야하는 C# 응용 프로그램을 개발 중입니다. 데이터를 암호화/해독하는 것이 .NET에서 일반적이라고 들었지만 그 역학에 대한 경험이 없습니다. Windows 8 앱에 Windows Phone과 비슷한 개인/보호 된 저장 공간이있는 경우 암호화가 여전히 권장/필요합니까?Windows 8에서 중요한 데이터를 저장하는 모범 사례

또한 데이터를 요청할 때마다 암호화/해독을 수행해도 성능 문제가 발생하지 않습니까? (사용자 정의/라이트 알고리즘을 작성하는 더 나은 것?)

+0

는 공격자가 누구입니까 당신의 위협 모델에서? 시스템 관리자 또는 권한이없는 불량 소프트웨어? – CodesInChaos

+8

** 자신의 보안 시스템을 개발하지 않는 것이 좋습니다 ** Windows에 비밀번호를 저장하려면 _Credential Manager_ (Win7 이후)가 있습니다. _WinRt_는 ['Windows.Security.Credentials'] (http://msdn.microsoft.com/library/windows/apps/windows.security.credentials.aspx) 네임 스페이스에 상응하는 API를 가지고 있지만 _it는 아직 문서화가 잘되어 있지 않습니다 ._ – ordag

답변

48

UPDATE : 현대/지하철 애플 리케이션이 서로의 물건에 파고 제한하는 동안, 바탕 화면 응용 프로그램이 API를 통해 저장된 모든 데이터에 제한없이 액세스 할 수 있음에 유의하십시오. 이것을 설명하는 코드가 포함 된 http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx을 참조하십시오.


Win8 당신을 위해 모든 어려운 문제를 돌봐 위해 설계 PasswordVault라는 새로운 API가 있습니다. 사용하기 쉽고 안전하며 사용자가 기계간에 로밍하도록 구성하여 한 번만 자격 증명을 입력하면됩니다. OAuth 토큰을 성공적으로 사용했습니다.

자격 증명을 가져 오는 중 (WinRT가 제기하는 바보 같은 예외가 있음을 유의하십시오.그들은 정말) 널 (null)을 반환해야합니다 :

const string VAULT_RESOURCE = "[My App] Credentials"; 
string UserName { get; set; }; 
string Password { get; set; }; 
var vault = new PasswordVault(); 

try 
{ 
    var creds = vault.FindAllByResource(VAULT_RESOURCE).FirstOrDefault(); 
    if (creds != null) 
    { 
     UserName = creds.UserName; 
     Password = vault.Retrieve(VAULT_RESOURCE, UserName).Password; 
    } 
} 
catch(COMException) 
{ 
    // this exception likely means that no credentials have been stored 
} 

저장 자격 증명 :

vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password)); 

제거 자격 증명 (사용자가 앱에서 로그 아웃 버튼을 클릭 할 때) :

vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName)); 
+0

코드를 보내 주셔서 감사합니다! 큰 도움. – Nick

+0

try 블록에서 _vaultedUserName 대신 UserName을 의미한다고 생각합니다 ... –

+0

@RobertLevy 암호 저장 작업으로 인해 발생할 수있는 예외에 대한 정보를 어디서 찾을 수 있는지 조언 해 주시겠습니까? THX –

-4

당신은 다음과 같이 암호화 할 수 있습니다 :

public static string EncodePassword(string password) 
    { 
     byte[] bytes = Encoding.Unicode.GetBytes(password); 
     byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes); 
     return Convert.ToBase64String(inArray); 
    } 

을 그리고 사용자 입력을 검사 할 때, 당신은 또한이 방법으로 그것을 생각하다 및에 확인 시합.

암호화/해독하고자하는 XML에 넣은 데이터의 경우 RijndaelManaged를 사용할 수 있습니다. -Edit1-

예 : 당신이 (ShowDialog를)를 팝업 작은 로그인 화면이있는 경우 당신이 할 수있는이 싹둑 - 그것처럼입니다 :

private void settings_Click(object sender, RoutedEventArgs e) 
{ 
    Login log = new Login(); //login window 
    log.ShowDialog();   //show the login window 
    string un = log.userName.Text; //the user input from the username field 
    string pw = log.passWord.Password; //the userinput from the password input 
    if (EncodePassword(un) == Properties.Settings.Default.adminUsername && EncodePassword(pw) == Properties.Settings.Default.adminPassword) //in my case, i stored it in the app settings, but this could also be somewhere else. 
    { 
     //login was correct 
     //do something 
    } 
    else 
    { 
     //login was not correct 
    } 
} 
+2

Nick은 "oAuth 토큰/암호를 저장해야하는 C# 응용 프로그램을 개발 중"이므로 응용 프로그램에서 해당 토큰과 암호를 다시 생성해야 할 가능성이 있습니다.이 경우 체크섬을 저장하고 원본을 삭제하면 도움이되지 않습니다. – Lumi

+0

에 따라 다릅니다. 암호로 사용되는 경우 사용자 입력을 메서드에 전달하고 출력 문자열을 저장된 문자열과 비교할 수 있습니다. 이것은 정확하게 내 응용 프로그램 중 하나에서 수행하는 방법입니다. – Dante1986

+1

@ Dante1986 : 물론, Nick이 웹 사이트처럼 보안 애플리케이션으로서 서버가 아닌 다른 애플리케이션 *에 대한 자격 증명을 저장할 필요가 있다고 생각합니다. Nick은 이것을 명확히하기 위해 문제에 대한 그의 설명을 자세히 설명 할 수 있습니다. – Lumi

0

그것을 당신이 진짜로 당신이 3DES/RC2/Rijndael 같은 양방향 암호화 알고리즘을 사용해야합니다 암호를 저장 해야하는 경우에 무엇을 필요로하는지에 따라 달라집니다.

그러나, 할 수 있기를 바란다는 것은 패스워드가 맞는지 확인하는 것이다. 해쉬를 저장하기 위해 oneway 함수를 사용하는 것이 좋다.

민감한 데이터를 다룰 때는 Windows 8을 사용하는 경우에도 암호화/해시를 권장합니다. 암호화는 추가 오버 헤드를 의미하지만 대부분의 경우 속도 차이를 느끼지 못합니다.

사용자 정의/라이트 알고리즘을 작성하는 것이 더 좋습니까? 보안 놈으로서 나는 그것을 반대합니다. 사람들은 수년간 테스트를 거쳐 기존의 알고리즘에 구멍을 찾고 개선하려고 노력합니다. 그러므로 살아남은 사람들은 꽤 좋습니다.

+0

감사합니다. 내 앱은 각 요청에 oAuth 토큰을 제공해야하는 Twitter 응용 프로그램입니다. 이러한 토큰은 처음 획득 할 때 저장해야합니다. 이제 XML 파일에 토큰을 암호화하지 않고도 정보가 부족하고 암호화 지식이 부족하여 Windows 8의 암호화 API를 사용하는 것에 "겁 먹었습니다". Windows 8에서도 암호화를 사용하는 것이 우수 사례이지만 Windows.Security.Credentials API를 통해 물적을 보탤 것입니다. 모든 도움을 주셔서 감사합니다 – Nick