2011-01-28 3 views
0

안녕하세요, 그래서 저장 및 저장 프로 시저를 사용하여 저장 해요 msql 데이터베이스에서. 내가 배치되기 전에 C#을 Windows에서 양식의 일부 데이터를 암호화하려고 노력하고있어 그리고 물론 내가 다시 당길 때 해독. 모든 암호화가 C# 측에서 처리됩니다. 난 microsoft's tripleDESCryptoService Class (메모리 버전, 두 번째 예제)에서 암호화 및 복호화에 대한 샘플 코드를 사용하고 있습니다. 값은 암호화되어 데이터베이스로 보내지지만 검색 할 때 "잘못된 데이터"오류가 발생합니다. 암호화 호출의 샘플 C# tripleDESCrypto 저장 및 SQL에서 검색된

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 
byte[] tempByte = new byte[100]; 
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte); 

txt_Last_Name

다음 데이터베이스로 전송되고, 나는 데이터베이스에 뭔가가 있다는 것을 볼 수있다 ...입니다. "csDecrypt.Read (fromEncrypt, 0 : 데이터베이스에, 마지막 이름에 ... varchar 형 (20) 복호화 호출

샘플이의 해독 기능에

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 
string lastName = dr.GetString(dr.GetOrdinal("Last Name")); 
if (isEncrypted) 
{ 
    byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName); 
    lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);      
} 
txt_Last_Name.Text = lastName; 

그 폭탄입니다 fromEncrypt.Length); " 나는 왜 그런지 이해하지 못한다. 데이터베이스에 올바르게 저장되지 않거나 내 전환이 올바르지 않은지 확실하지 않습니다.

복호화 기능으로 들어가는 "데이터"는 크기가 16이고 0이 아닌 값을 포함하지만 "byte [] fromEncrypt"는 모두 0을 포함하는 크기 16의 배열입니다.

도움을 주셔서 감사합니다!

+1

tempByte는 유니 코드 문자열로 처리해야합니다. 문자열이 아니어도 마찬가지입니다. – pascal

+0

TripleDES는 약한 것으로 간주됩니다. 대신 AES 사용을 고려해야합니다. :) – ykatchou

답변

3

EDIT : 좋아요, 우리는 그 밑으로 가봐야합니다 ... ASCII 문제도 물 렸을지라도.

TripleDESCryptoServiceProvider을 새로 만들고 키/IV를 요청할 때마다 새로운 키가 생성됩니다. 데이터를 해독하는 데 필요하므로 어딘가에 안전하게 저장해야합니다. 당신은 tempByte에 임의의 바이너리 데이터를 가지고

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte); 

: 정말 암호화하지 그래서 그렇지 않으면 당신이 ...


어떤 "비밀"이없는이 끔찍한 생각이다. 은 유효한 ASCII 텍스트라고 가정하지 마십시오. 데이터 손실이 거의 확실합니다.

텍스트로 불투명 한 이진 데이터를 안전하게 인코딩하려면 Convert.ToBase64StringConvert.FromBase64String을 사용하십시오.

byte[] tempByte = new byte[100]; 
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 

당신이 다음 그것을 무시하려고하는 경우 바이트 배열을 생성하는 점은 무엇입니까 :

또한이 나쁜 생각입니까?

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 

을 대신 사용하십시오. 아. 그리고 .NET 명명 규칙을 따르려고 시도하십시오.

귀하의 암호화가 항상 16 제로의 바이트 배열을 반환하는 경우, 이는 귀하의 encrypt 메소드가 손상되었다는 아주 확실한 신호입니다. 우리는 그 방법에 대한 코드를 게시 할 때까지는 실제로 거기에서 도울 수 없습니다.

마지막으로, 열의 유형이 varchar(20) 인 경우 해당 데이터가 필요한 모든 데이터를 보유하지 못할 수도 있음을 알고 있어야합니다.특히 소금을 넣으 려한다면 Base64는 데이터의 크기를 다소 늘릴 것이며 암호화도 그렇게 할 것입니다. 다른 대답에서 언급했듯이, 데이터베이스에 바이너리 을 저장하는 것이 여러면에서 더 현명 할 것입니다.

(참고 :.. 당신이 그 코드를 사용하려면 않은 경우에도 내가 txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);로 써서 사용 지침은 당신의 친구, 그리고 ASCIIEncoding의 속성이 아닌 ASCIIEncoding입니다)

+0

byte []를 chars로 변환하는이 이야기를 살펴보면, ASCIIEncoding의 사용에 기반한 잘못된 솔루션의 수는 놀랍습니다. – pascal

+0

@pascal : * any * normal 인코딩의 사용은 여기에서 문제입니다 ... 그러나 대개 ASCII 또는 UTF-8입니다. –

+0

나는 링크를 통해 암호화 방법을 제공했으며, 이는 microsoft의 tripleDES ... msdn의 Provider 클래스 페이지에 있습니다. tempByte는 단지 개념 증명이었습니다. 바이트 배열을 만들지 않고 그것을 무시하고 바뀌 었습니다. convert.to와 from 64를 사용하고 있습니다. 여전히 실패합니다. 나는 이진 형식을 SQL에서 시도해야 할 것 같아 ... –

0

그냥 reading the doc ... Convert.ToBase64String()을 사용하여 바이트 []를 문자열로 변환해야합니다.

+0

... 그리고 존 스키켓 (Jon Skeet)이 나를 32 초나 때리고, 상대에게 : Convert.FromBase64String'을줍니다. – pascal

+0

음, 변환 방법을 시도했지만 여전히 작동하지 않습니다 ... 감사합니다! –

0

위의 권장 파스칼로 Convert.ToBase64String()을 사용하거나 텍스트 대신 데이터베이스에 바이너리로 데이터를 저장하십시오 (공간을 덜 사용하기 때문에 선호되는 해결책). SQL Server에는 이러한 용도로 VARBINARY (MAX) 데이터 형식이 있습니다.

+0

죄송합니다. Jon의 답변이 이미 바이너리로 저장하도록 제안했는지 알지 못했습니다. –

관련 문제