none
Защита сервера и информации в сети RRS feed

  • Общие обсуждения

  • Здравствуйте!

    Как то копаясь в интернете я нашел статьи про создании серверов и клиентов. Для понятности я привел две ссылки именно на те статьи которые меня заинтересовали. Они основаны на Socket. Я создаю примерно такое же клиент-серверное приложение, и мне хотелось бы защитить данные от взлома, подмены и т.п.

    Во первых я не знаю стоит ли шифровать передаваемые данные? Или же использовать какой-нибудь засекреченный протокол?

    Во вторых подмена данных в процессе передачи возможна?

    Вскрытие программы и понятие принципов взаимодействия с сервером, команд серверу..

    Если кто нибудь сталкивался с такими задачами помогите пожалуйста идеями организации безопасного взаимодействия?

    Заранее спасибо!

    1 ноября 2011 г. 8:57

Все ответы

  • Шифруйте данные и передавайте их используя защищенный протокол, например SSL.

    Расшифровка и подмена данных возможна будет, если злоумышленник узнает секретные ключи.


    Для связи [mail]
    3 ноября 2011 г. 7:41
  • Тогда где или как стоит хранить ключи?
    3 ноября 2011 г. 19:32
  • Посмотрите похожий топик Уникальный ключ программы, возможно он окажется полезным.
    Для связи [mail]
    15 ноября 2011 г. 14:09
  • Почитайте  http://www.rsdn.ru/article/crypto/cryptoapi.xml

    Ну и в хелп вам пример кода хелпера по шифрованию/душифрованию с закрытым ключем:

        public class LocalCryptoHelper
        {
            public const int Standart = 1024;
    
            private int _bitLength;
    
            public LocalCryptoHelper(int bitLength)
            {
                _bitLength = bitLength;
            }
    
            public KeyValuePair<string, string> GenerateKeys()
            {
                var rsaProvider = new RSACryptoServiceProvider(_bitLength);
    
                string publicAndPrivateKeys = rsaProvider.ToXmlString(true);
    
                string justPublicKey = rsaProvider.ToXmlString(false);
    
                return new KeyValuePair<string, string>(publicAndPrivateKeys, justPublicKey);
            }
    
            public string GenerateSignature(string  inputString, string privateKey)
            {
                CspParameters _cpsParameter;
    
                _cpsParameter = new CspParameters();
                _cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;
    
                var rsa = new RSACryptoServiceProvider(_bitLength, _cpsParameter);
    
                rsa.FromXmlString(privateKey);
    
                var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
    
                rsaFormatter.SetHashAlgorithm("SHA1");
    
                var sHhash = new SHA1Managed();
    
                byte[] signedHashValue = rsaFormatter.CreateSignature(sHhash.ComputeHash(new UnicodeEncoding().GetBytes(inputString)));
                string signature = Convert.ToBase64String(signedHashValue);
    
                return signature;
            }
    
            public bool ValidateSignature(string inputString, string publicKey, string signature)
            {
                var rsa = new RSACryptoServiceProvider();
    
                rsa.FromXmlString(publicKey);
    
                var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
    
                rsaDeformatter.SetHashAlgorithm("SHA1");
    
                var sHhash = new SHA1Managed();
    
                return rsaDeformatter.VerifySignature(
                        sHhash.ComputeHash(new UnicodeEncoding().GetBytes(inputString)),
                        Convert.FromBase64String(signature)
                    );
            }
    
            public string EncryptString(string inputString, string xmlString)
            {
                CspParameters _cpsParameter;
    
                _cpsParameter = new CspParameters();
                _cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;
    
                // TODO: Add Proper Exception Handlers
                RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(_bitLength, _cpsParameter);
                rsaCryptoServiceProvider.FromXmlString(xmlString);
                int keySize = _bitLength / 8;
                byte[] bytes = Encoding.UTF32.GetBytes(inputString);
                // The hash function in use by the .NET RSACryptoServiceProvider here is SHA1
                // int maxLength = ( keySize ) - 2 - ( 2 * SHA1.Create().ComputeHash( rawBytes ).Length );
                int maxLength = keySize - 42;
                int dataLength = bytes.Length;
                int iterations = dataLength / maxLength;
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i <= iterations; i++)
                {
                    byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ? maxLength : dataLength - maxLength * i];
                    Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);
                    byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true);
                    // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption.
                    // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors.
                    // Comment out the next line and the corresponding one in the DecryptString function.
                    Array.Reverse(encryptedBytes);
                    // Why convert to base 64?
                    // Because it is the largest power-of-two base printable using only ASCII characters
                    stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
                }
                return stringBuilder.ToString();
            }
    
            public string DecryptString(string inputString, string xmlString)
            {
                // TODO: Add Proper Exception Handlers
                var rsaCryptoServiceProvider = new RSACryptoServiceProvider(_bitLength);
                rsaCryptoServiceProvider.FromXmlString(xmlString);
                int base64BlockSize = ((_bitLength / 8) % 3 != 0) ? (((_bitLength / 8) / 3) * 4) + 4 : ((_bitLength / 8) / 3) * 4;
                int iterations = inputString.Length / base64BlockSize;
                ArrayList arrayList = new ArrayList();
                for (int i = 0; i < iterations; i++)
                {
                    byte[] encryptedBytes = Convert.FromBase64String(inputString.Substring(base64BlockSize * i, base64BlockSize));
                    // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption.
                    // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors.
                    // Comment out the next line and the corresponding one in the EncryptString function.
                    Array.Reverse(encryptedBytes);
                    arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(encryptedBytes, true));
                }
    // ReSharper disable AssignNullToNotNullAttribute
                return Encoding.UTF32.GetString(arrayList.ToArray(Type.GetType("System.Byte")) as byte[]);
    // ReSharper restore AssignNullToNotNullAttribute
            }
    
        }
    


    3 февраля 2012 г. 13:38
  • Если данные передаются не мегабайтами в секунду, а лишь изредка, то имеет смысл шифровать

    Быть может имеет смысл сделать VPN - сеть, например через Kerio или Hamachi

    3 февраля 2012 г. 13:40