728x90
프로그램을 만들고 나서 Serial키 인증에 대한 여러 알고리즘을 공부하였다.
하지만, 이것을 효율적으로 사용하는데 있어서 현재의 생각을 적는다.
우선, 프로그램을 실행하는 PC의 고유 번호를 사용한다.
윈도우의 경우는 mainboard의 넘버를 이용하는 것 같은데.. mainboard의 serial number가 "not applicable" 메세지가 뜬다.
그래서, ProcessorID 값을 사용하는 방법으로 바꿨다.
우선 ProcessorID 값과 프로그램 고유의 Key 값을 나열하여 이를 byte로 변환하고 SHA512와 같은 해쉬 코드 값을 얻는다.
그리고 이를 저장할 때는 텍스트가 아닌 파일 암호화 AES 또는 RSA 와 같은 알고리즘을 이용하여 또 다시 serial 키 값을 암호 저장시킨다.
이렇게 하여, 변환된 serial 코드 값이 밖으로 노출 되는 것을 막을 수 있을 것이다.
< serialKey 값과 ProcessorID 값을 이용하여 serial key 값 생성 >
ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"); ManagementObjectCollection mobos = search.Get(); string strSerial = serialKey; foreach (ManagementObject m in mobos) { var serial = m["ProcessorId"]; // ProcessorID if you use Win32_CPU strSerial += serial.ToString(); } char[] chSerial = strSerial.ToCharArray(); Listcbyte = new List (); foreach(char cc in chSerial) { byte[] ss = BitConverter.GetBytes(cc); cbyte.Add(ss[0]); } byte[] bytes = cbyte.ToArray(); byte[] result = new byte[126]; SHA512 sha = new SHA512Managed(); result = sha.ComputeHash(bytes); for (int i = 0; i < result.Length; i++) { str += result[i].ToString("X2"); if (i != result.Length - 1) { str += "-"; } } txtSerialCode.Text = str;
< 생성한 코드를 AES 알고리즘을 이용하여 암호화 파일 저장 / 읽기 >
private void OnAesFileEncrypt(string _plaintext, string _savePath, string _key, string _iv) { FileStream fs = new FileStream(_savePath, FileMode.Create, FileAccess.Write, FileShare.None); var _aesCrypto = Aes.Create(); _aesCrypto.Key = Encoding.ASCII.GetBytes(_key); _aesCrypto.IV = Encoding.ASCII.GetBytes(_iv); ICryptoTransform encryptor = _aesCrypto.CreateEncryptor(_aesCrypto.Key, _aesCrypto.IV); using(CryptoStream cryptoStream = new CryptoStream(fs, encryptor, CryptoStreamMode.Write )) { using (StreamWriter swEncrypt = new StreamWriter(cryptoStream)) { swEncrypt.Write(_plaintext); } } fs.Close(); } private void OnAesFileDecrypt(string _openPath, string _key, string _iv, out string _decryptStr) { FileStream fs = new FileStream(_openPath, FileMode.Open, FileAccess.Read, FileShare.None); var _aesCrypto = Aes.Create(); _aesCrypto.Key = Encoding.ASCII.GetBytes(_key); _aesCrypto.IV = Encoding.ASCII.GetBytes(_iv); ICryptoTransform decryptor = _aesCrypto.CreateDecryptor(_aesCrypto.Key, _aesCrypto.IV); using (CryptoStream cryptoStream = new CryptoStream(fs, decryptor, CryptoStreamMode.Read)) { StreamReader srDecrypt = new StreamReader(cryptoStream); _decryptStr = srDecrypt.ReadToEnd(); } fs.Close(); }
728x90
728x90