2009-02-09 1 views
1

내 사용자에게 "0! ZWQ2"와 같은 암호 필드가 데이터베이스에 저장되어 있습니다. "aA1234"에서 "0! ZWQ2"까지 사용자 입력 암호를 ​​해독하여 데이터베이스의 데이터와 비교해야합니다. !2 개의 문자열을 비교할 때 한 값을 다른 값으로 바꾸는 방법은 무엇입니까?

내가 비교 2 개의 문자열은 다음과 같습니다

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 와 "9setybcpqwiuvxr108daj5'-`~ @ # $으로의 %^& *() _ + |}] [{:.?/< > · · · ZWQ2 @ #의 34KDA "

이 방법은 = 9, 0 = A

어떻게, C#으로 어떤 아이디어가 이런 짓을 했을까?

사용자 입력에서 암호 필드를 가져 와서 재미있는 텍스트로 변환하여 데이터베이스의 데이터와 비교하면됩니다.

도움이 될 것입니다.

감사 에티엔 느

업데이트 : (2009 2월 10일) 회신에 대한 감사합니다 여러분. 이 핸드 쉐이핑 방법이 훨씬 더 있음을 알고 있습니다. 그러나 나는 ASP.NET 응용 프로그램을 만들어 SharePoint에 앉아서 Cobol 플랫 파일 데이터에 연결하고 적절한 데이터베이스가 아닌지 확인합니다. Transoft를 사용하여 ASP.NET (ODBC 커넥터)을 Cobol 플랫 파일에 연결합니다. 그래서이 코드를 고수해야하는데, 이건 내 개인 사이트에서 사용되지 않습니다. 나는 또한 암호가 Cobol에서 언제 창조되는지에 통제가 없다.

+0

방금 ​​귀하의 정확한 요구 사항에 답변했습니다. 학습용으로 만 사용하는 경우에는 괜찮습니다. 그러나 실제 프로젝트에서 이런 종류의 스크램블링을 사용하지 않도록 조심하십시오. 이러한 종류의 작업을 위해 .net에서 많은 암호화 기술을 inbuilt 할 수 있습니다. 행운을 빕니다 :) –

답변

5

변환 할 때 빠른, 빠르며 적은 코드 예제가 있습니다.

코드 C에서 # : VB에서

 char[] OriginalChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray(); 
     char[] ScrambleChars = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDART".ToCharArray(); 
     string TextToTransfer = "Hello"; 
     string NewText = ""; 
     foreach (char c in TextToTransfer) 
     { 
      NewText = NewText + ScrambleChars[Array.IndexOf<char>(OriginalChars, c)].ToString(); 
     } 
     Console.WriteLine(NewText); 

코드 : 다른 사용자가 언급 한대로이 시스템 및 암호 저장 방법을 설계하는 경우

Dim OriginalChars() As Char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 
    Dim ScrambleChars() As Char = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDART" 
    Dim TextToTransfer As String = "Hello" 
    Dim NewText As String = "" 
    For Each c As Char In TextToTransfer 
     NewText += ScrambleChars(Array.IndexOf(OriginalChars, c)) 
    Next 
    MsgBox(NewText) 
+0

좋은 물건! !! 정말 고맙습니다!!!!!! – Etienne

+0

그 루프에서 stringbuilder를 사용해야합니까? – Svish

5

Caesars 암호 대신 암호를 저장하기 위해 표준 해시 + 소금을 사용하지 않는 특별한 이유가 있습니까? 그것은 (테스트되지 않은 코드)를 해결해야

한 가지 방법 : 내가 인코딩을 포함하는 유틸리티 클래스를 작성하거나 불량/악성 입력에 대한 inputString과 (검사 소요 방법을 번역 것

new string("aA1234".ToCharArray().Select(c => ScrambleChars[OriginalChars.IndexOf(c)]).ToArray()); 
+0

+1 - 이것은 보안을 통해 무명입니다. 나는이 사이트를 사용하지 않기를 바란다 ... –

+0

ASP.net – Etienne

+0

과 함께 Cobol 플랫 파일 사용 그는 데이터베이스에서 암호를 하나와 비교한다고 말하면서 저장을위한 암호를 암호화하는 데 도움이 될 것이라고 확신한다. 이것은 그가 통제 할 수 있었던 것이었다. –

0

)는 암호 방식을 사용하여 변형합니다.

return String.Compare(dbPassword, PasswordUtility.Encode(inputString)); 
2

암호를 되돌릴 수있는 방식으로 데이터베이스에 저장하면 안됩니다. 시스템을 침범하는 데이터베이스 관리자 또는 해커가 사용자의 저장된 암호를 가져올 수 없어야합니다.

1

첫째,이 방법은 거의 쓸모가 대신에 사용해야하는 보안 방법이 많이 있습니다.

그러나이 작업을 비교할 것을 요구한다는 사실로 인해 데이터베이스에 이미있는 항목을 제어 할 수 없다고 생각하게되어 기존의 작업과 관련이 있습니다.

아래 함수는 사용자 비밀번호를 문자열로 취해 데이터베이스 비밀번호를 문자열로 반환합니다. 한 가지주의 할 점은, 제공 한 두 개의 문자열이 길이가 같지 않아 문자 9와 0에서 충돌합니다. 추가 문자 B와 C를 dbChars 문자열에 추가했습니다. 또한 나는 매핑 문자에서 찾을 수없는 모든 문자가 입력 된대로 추가된다는 것을 "가정"했습니다. 이러한 문자는 무시해야 할 수도 있습니다.

private string DatabasePassword(string userPassword) 
    { 
     //Constants showing mapping between user password and database password 
     const string userChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     const string dbChars = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDABC"; 

     //Stringbuilder used to build the database password for output 
     System.Text.StringBuilder databasePassword = new System.Text.StringBuilder(); 

     //Run through every character in the user password 
     foreach (Char userChar in userPassword) 
     { 
      //Find the index of the user character in the userChars string. 
      int userCharIndex = userChars.IndexOf(userChar); 

      //if the userChar exists in the userChars string then map the character to the 
      //equivalent database pasword character else just use the entered char 
      char mappedChar = userCharIndex >= 0 ? dbChars[userChars.IndexOf(userChar)] : userChar; 

      //Append mapped password to the output database password 
      databasePassword.Append(mappedChar); 
     } 

     return databasePassword.ToString(); 
    } 
관련 문제