2011-03-31 4 views
0

조금 더 많은 배경 정보 제안 : 나는 인트라넷 CMS 웹 응용 프로그램 (ASP.NET 기반) 제품 API를 사용해야하는 finsihing 해요. 시간 제한과 Windows 인증 문제로 인해 직원들이 개인 설정된 콘텐츠를보기 위해 사이트를 방문 할 때마다 다시 로그인 할 필요가 없도록 다른 방법이 필요합니다. 작동 방식은 사용자가 로그인하면 (사용자 이름/암호) 맞춤형 콘텐츠를 표시하는 데 사용되는 새로운 다른 보안 컨텍스트 값을 저장하는 세션 ID가 생성된다는 것입니다. 호출 된 API 로그인 메소드는 사용자 이름과 비밀번호를 매개 변수로 사용합니다. 직원이 다음 번에 사이트를 방문 할 때 자동으로 로그인하는 유일한 방법은 암호를 해독 된 쿠키에 저장하고 사이트 방문시 기존 암호를 확인한 다음 사용자 이름과 해독 된 암호를 사용하여 API 로그인 방법을 호출하는 것입니다 쿠키 값.해독 할 때 C# 코드 암호화 오류!

다른 대안으로 환영합니다.

안녕, 나는 암호화 및 암호 문자열을 해독하기 위해 웹에서 발견 된 일부 코드를 사용하고 있습니다. 그것은 잘 암호화하지만 문자열을 해독하기 위해 아래 코드를 호출하면 "데이터의 길이가 유효하지 않습니다."어떻게 해결할 수 있습니까?

미리 감사드립니다.

System.Text.Encoding enc = System.Text.Encoding.ASCII; 
      byte[] myByteArray = enc.GetBytes(_pword); 


      SymmetricAlgorithm sa = DES.Create(); 
      MemoryStream msDecrypt = new MemoryStream(myByteArray); 
      CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read); 
      byte[] decryptedTextBytes = new Byte[myByteArray.Length]; 
      csDecrypt.Read(decryptedTextBytes, 0, myByteArray.Length); 
      csDecrypt.Close(); 
      msDecrypt.Close(); 

      string decryptedTextString = (new UnicodeEncoding()).GetString(decryptedTextBytes); 

답변

0

는 사실 전에이 오류를 했어 그리고 해결책을 알아 내기 위해 삼일 걸렸다. 문제는 암호 해독에 필요한 시스템 키가 시스템 자체에 등록되어야한다는 사실입니다.

DES 암호화를 완전히 읽으면 응용 프로그램 키와 컴퓨터 수준의 키로 작동합니다. 기계 키가 누락되어 오류가 발생했을 가능성이 큽니다.

0

(암호화 방법에서) _pword 문자열을 만드는 데 사용 된 바이트를 GetBytes로 검색 한 바이트와 비교하십시오. 아마 당신은 거기에있는 데이터의 변화를 느낄 것입니다.

암호화 된 바이트를 저장하려면 Convert.ToBase64String을 사용해야하고 Convert.FromBase64String은 암호화 된 비밀번호를 /에서 문자열로 변환해야한다고 생각합니다.

키와 IV를 설정 한 코드도 표시되지 않습니다. 암호를 암호화하고 해독하는 데 다른 키를 사용하고있는 것 같습니다. 현재 키 속성이 null의 경우

는 GenerateKey 방법은 새로운 임의의 키를 생성 로라고합니다. 현재 IV 속성이 null이면 GenerateIV 메서드가 호출되어 새 임의 IV가 만들어집니다.

3

여기에 몇 가지 ...

  1. 당신은 일반적으로 암호를 암호화하지 않아야합니다. hash해야합니다.

암호화의 길을 계속 결정하면 ..

  1. DES 알고리즘을 사용 중입니다. 이것은 안전하지 않고 결함이있는 것으로 간주됩니다. AES 알고리즘을 살펴 보는 것이 좋습니다.
  2. 작업하는 데이터의 양에 따라 CryptoStream이 과도 할 수 있습니다.
  3. ASCII 인코딩을 사용하면 키릴 문자와 같이 ASCII가 아닌 데이터가 손실 될 수 있습니다. 권장되는 해결 방법은 UTF8과 같은 다른 것을 사용하는 것입니다.

    string text = "Hello"; 
    using (var aes = new AesManaged()) 
    { 
        var bytes = System.Text.Encoding.UTF8.GetBytes(text); 
        byte[] encryptedBytes; 
        using (var encrypt = aes.CreateEncryptor()) 
        { 
         encryptedBytes = encrypt.TransformFinalBlock(bytes, 0, bytes.Length); 
        } 
        byte[] decryptedBytes; 
        using (var decrypt = aes.CreateDecryptor()) 
        { 
         decryptedBytes = decrypt.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); 
        } 
        var decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes); 
        Console.Out.WriteLine("decryptedText = {0}", decryptedText); 
    } 
    

    이 임의의 키마다 사용합니다 : 여기

은 예입니다. 일부 데이터를 암호화 한 다음 나중에 해독해야 할 수 있습니다. AesManaged 개체를 만들 때 KeyIV 속성을 저장할 수 있습니다. 원하는 경우 동일한 키를 다시 사용할 수 있지만 다른 데이터는 항상 다른 IV (초기화 벡터)로 암호화해야합니다. 그 열쇠를 보관하는 곳은 당신에게 달려 있습니다. 그것이 해싱이 더 나은 대안 일 수있는 이유입니다. 키가 없으며 안전하게 키를 저장하는 것에 대해 걱정할 필요가 없습니다.

var textToHash = "hello"; 
using (SHA1 sha = new SHA1Managed()) 
{ 
    var bytesToHash = System.Text.Encoding.UTF8.GetBytes(textToHash); 
    var hash = sha.ComputeHash(bytesToHash); 
    string base64hash = Convert.ToBase64String(hash); 
} 

이 암호 잘 작동해야 SHA1 알고리즘을 사용은, 그러나 당신이 SHA256을 고려할 수 있습니다 :

당신이 해시 경로를 아래로 이동하려면

, 여기에 작은 예이다.

개념은 간단합니다. 해시는 입력에 대해 (대부분) 고유 한 출력을 생성하지만 출력을 입력으로 다시 변환 할 수 없습니다. 이는 파괴적입니다. 사용자를 인증해야하는지 확인하고 싶을 때마다 해시 암호를 확인하고 올바른 암호의 해시를 확인하십시오. 그렇게하면 민감한 것을 저장하는 것이 아닙니다.

+0

암호는 내부 웹 응용 프로그램에 사용됩니다. 나는 해시 루트를 대신 사용할 수도 있다고 생각한다. 예제를 어디서 찾을 수 있습니까? – mjakda

+0

@mjakda : 답변이 업데이트되었습니다. – vcsjones

+0

하지만 사용자가 새로운 방문에 대한 비교를 위해 암호를 입력하지 않는 시나리오의 해싱 작업이 필요합니까? – mjakda

0

DES는 블록 기반 암호입니다. 특정 길이의 버퍼 만 유효합니다. 올바르게 기억하면 DES의 블록 크기는 64 비트이므로 바이트 배열이 8 바이트 길이의 배수인지 확인해야합니다.

(즉, 즉각적인 문제를 해결해야하지만 다른 사람들의 조언을 여기에서 참조하십시오. 새 코드에는 DES를 사용하지 말아야하며 암호는 일반적으로 암호화하는 것보다 해시에 더 적절합니다).

관련 문제