2011-10-10 4 views
1

MySQL의 :MySQL의에서 AES _Encryption, 암호 해독 C에서 # 닷넷

SELECT AES_ENCRYPT('Test','pass') 

AES_ENCRYPT() 및 AES_DECRYPT() 공식 AES 이전으로 알려진 (고급 암호화 표준) 알고리즘을 사용하여 데이터의 암호화 및 암호 해독을 가능하게 " Rijndael. "128 비트 키 길이의 인코딩이 사용되지만 소스를 수정하여 최대 256 비트까지 확장 할 수 있습니다. 훨씬 빠르며 대부분의 경우 충분히 안전하기 때문에 128 비트를 선택했습니다.

http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_aes-encrypt

나는 C# .NET에서 Decryped Strig에 그 암호화 된 문자열을 변환하려고했지만, 난 예상대로 나는 결과를 얻을 수 없습니다.

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx#Y0

I는 암호문을 전달이 방법 내가 MySQL과 Rijndael.Create을 (usedfrom 키 값)에서

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV) 

. IV 바이트 [] IV

I 사용 C 번호 코드하지만 예상 결과를 얻을 수 없습니다. 검토 코드와 실수 여기

+0

그들이 사용하는 IV에 대해 아무것도 언급하지 않는 MySQL의 문서는 ... 아주 기본적인 뭔가 (AN처럼 될 수있다 IV 가득 0x00) ... C#에서 사용하는 IV MSDN 설명서 당 임의의 하나입니다 ... – Yahia

+0

작업 모드 및 패딩 구성표는 MySQL 문서에 설명되어 있지 않습니다. [이 링크] (** http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html)의 ** John Bayly ** 님이 작성한 의견을 –

답변

1

을 만든 곳 IDK를 MySQL을로 C#을 통해 동일한 암호화를 달성하기위한 몇 가지 작업 코드는 코멘트 :

public byte[] AESEncrypt(byte[] plaintext, byte[] key) { 
/* 
* Block Length: 128bit 
* Block Mode: ECB 
* Data Padding: Padded by bytes which Asc() equal for number of padded bytes (done automagically) 
* Key Padding: 0x00 padded to multiple of 16 bytes 
* IV: None 
*/ 
RijndaelManaged aes = new RijndaelManaged(); 
aes.BlockSize = 128; 
aes.Mode = CipherMode.ECB; 
aes.Key = key; 

ICryptoTransform encryptor = aes.CreateEncryptor(); 
MemoryStream mem = new MemoryStream(); 
CryptoStream cryptStream = new CryptoStream(mem, encryptor, 
CryptoStreamMode.Write); 

cryptStream.Write(plaintext, 0, plaintext.Length); 
cryptStream.FlushFinalBlock(); 

byte[] cypher = mem.ToArray(); 

cryptStream.Close(); 
cryptStream = null; 
encryptor.Dispose(); 
aes = null; 

return cypher; 
} 

자세한 내용은 참조하십시오 MySQL Bug # 16713

편집 :

위의 내용은 공식적으로 문서화되지 않은 정보에 의거하고 있으므로 (작동하지만) 나는이를 피하고 answer from Vinko Vrsalovic에 설명 된 옵션 중 하나를 사용하는 것이 좋습니다.

+0

잘 읽지 못하면이 http : //social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/5e8f820f-6b7b-4047-85e9-456d4dc40a2f –

+0

이것은 완전히 다른 문제입니다. 쿼리의 결과를 문자열로 변환해야합니다. .. – Yahia

1

고통의 길을 걷고 있습니다. MySQL에서 암호 해독/암호화하거나 데이터베이스에 대한 암호화 된 연결 (문제가있는 경우) 또는 .NET 응용 프로그램에서 암호화/해독하여 암호화 된 데이터를 적절한 열에 저장합니다.

AES 구현을 혼합하면 실수가 발생할 수 있으며 .NET 또는 MySQL 버전을 변경하면 문제가 쉽게 발생할 수 있습니다.

정확히 무엇이 잘못되었는지 알아 보려면 IV가 MySQL과 .NET간에 호환되는지 알아야합니다. 그렇지 않으면 MySQL 구현 IV가 무엇인지 알아 내고이를 제공하십시오.

그리고 다른 잠재적 인 문제는 바이트 배열을 생성 한 방법입니다 (우리는 귀하의 예제에서이를 볼 수 없습니다). 키가 텍스트 인 경우 배열을 생성 할 때 문자 인코딩 문제를 고려해야합니다.

this MySQL docs link의 설명에 누락 된 매개 변수에 대한 정보가 있습니다.

+0

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/5e8f820f-6b7b-4047-85e9-456d4dc40a2f –

1

SELECT AES_ENCRYPT ('Test', 'pass')를 실행하면 은 암호화되지 않은 네트워크를 통해 전달되므로 모든 사람이 데이터를 암호화 할 수 있습니다.

AES_ENCRYPT는 데이터를 저장하는 데 사용되므로 데이터베이스가 해킹 당하면 데이터를 전송하지 않아도 데이터가 안전합니다.

당신이 그물 작업을 통해 데이터 암호화는 SSL 소켓을 사용하여 MySQL 서버에 접속하려는 경우