عنوان:

‫رمزنگاری Connection String از طریق خط فرمان


نویسنده: سیروان عفیفی
تاریخ: ۱۳۹۱/۰۵/۰۲ ۱۹:۱۶
آدرس: www.dntips.ir

برای رمز نگاری Connection String ابتدا Command Prompt  را از مسیر زیر باز کنید 


Start Menu\Programs\Microsoft Visual Studio 2010\Visual Studio Tools\Visual Studio Command Prompt
و سپس دستور زیر را برای رمزنگاری Connection String وارد کنید :
aspnet_regiis.exe -pef "connectionStrings" "sulotion path"
در اینجا پارامتر اول (pef) مشخص می‌کند که Application ما از نوع File System Website است،پارامتر دوم(connectionStrings) نام کلید موردنظری است که می‌خواهیم Encrypt شود،در اینجا می‌توانیم هر کلیدی را Encrypt  کنیم به عنوان مثال فرض کنید تنظیمات SMTP را در Web.Config بدین صورت داریم : 
<system.net> 
    <mailSettings> 
      <smtp deliveryMethod="Network"> 
        <network host="smtp.gmail.com" port="587" userName="username@gmail.com" password="password" /> 
      </smtp> 
    </mailSettings> 
  </system.net> 
برای رمزنگاری بدین صورت عمل می‌کنیم :
aspnet_regiis.exe -pef "system.net/mailSettings/smtp" "sulotion path"
و بعد از Encrypt کردن توسط دستور فوق بدین صورت در Web.Config نمایش داده می‌شود :
  <system.net>
    <mailSettings>
      <smtp configProtectionProvider="RsaProtectedConfigurationProvider">
        <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
          xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <KeyName>Rsa Key</KeyName>
              </KeyInfo>
              <CipherData>
                <CipherValue>QuOFQrT6XwxDhQjFnM3EByleyWqYY6lA1cGK1Dzli/hrDOYSj35ADk4MB3PeLOMVYh76kB8vch0/iZKAZaJlNUPKi/iZjEzE755B3sILKGLxfkH3j3qKHB0x1WN65L6zBXgzufphCVaNRobQXOl5J3E0Df8VCf/bERZu741HLPs=</CipherValue>
              </CipherData>
            </EncryptedKey>
          </KeyInfo>
          <CipherData>
            <CipherValue>NdwBe0mWZ+Yg/DEzNuiDfXlGpicoH1ZMn54FTrLuVsY3rawS/k6KPID3bZvOWB/XYseTYFGhqs7FUEqIYMvWjJYYmDAzk6dd4iv9y6ch3ZcXWQ/R5TkQLWoLQPYgdwGI3uJNs22t28xUISm1wS0uDbizCM2Io+DzSQe8N4Ih2MP9mb2NCbZ4BZEBCPvCevpSpdEjGN9v7hk=</CipherValue>
          </CipherData>
        </EncryptedData>
      </smtp>
    </mailSettings>
  </system.net>
در اینجا Encryption از نوع RSAProtectedConfigurationProvider انتخاب شده است که می‌توانیم آنرا به DataProtectionConfgurationProvider تغییر دهیم که مورد اول از روش رمز نگاری کلید عمومی RSA استفاده می‌کند.
برای Decrypt کردن هم فقط کافی است پارامتر اول دستور aspnet_regiis را به pdf تغییر دهیم :
aspnet_regiis.exe -pdf "system.net/mailSettings/smtp" "sulotion path"


نظرات

  • وحید نصیری در ۱۳۹۱/۰۵/۰۳ ۱۳:۱۲
    البته خیلی‌ها دسترسی به سرور برای انجام این نوع کارها را ندارند. به همین جهت امکان انجام آن از طریق برنامه نویسی هم مهیا شده: (^)
    • مهمان در ۱۳۹۱/۱۰/۰۸ ۹:۱۵
      سلام؛من میخوام کانکشن استرینگم رو رمز نگاری کنم.
      از روش EF استفاده کردم و تحت ویندوز هست آیا این روش مناسب هستش؟
  • مهمان در ۱۳۹۲/۰۳/۲۱ ۱۸:۴۱
    سلام؛ بنده سایتم رو رویه لوکال پاپلیش کردم بعد مطالبی رو که بالا نوشته شده رو اعمال کردم و سایت رو ریختم رویه هاست.خطای ران تایم ارور میده.باید ابتدا کانکشن استرینگ رو رمز بکنم بعد عمل پاپلیش رو انجام بدم یا اینکه باید عمل دیگه  ای انجام بشه.
    • وحید نصیری در ۱۳۹۲/۰۳/۲۱ ۲۰:۳۸
      حاصل این رمزنگاری بر اساس کلیدهای موجود در کامپیوترهای مختلف متفاوت خواهد بود. بنابراین روی سرور باید رمزنگاری شود. اگر دسترسی مدیریتی دارید، روش خط فرمان مناسب است؛ اگر خیر، این روش با برنامه نویسی هم قابل اجرا است.
      • مهمان در ۱۳۹۳/۰۲/۲۲ ۲:۵۶
        لینکی که معرفی کردین فقط  رمزنگاری رو انجام میده . برای decrypt  کردن چه کاری باید انجام بدیم ؟ و اینکه بنده از EF  database first  استفاده میکنم . چه موقع و کجا باید این عمل encrypt  و decrypt  رو انجام بدم ؟ ضمن اینکه از هاست اشتراکی استفاده میکنم .
        متشکرم
        • وحید نصیری در ۱۳۹۳/۰۲/۲۲ ۹:۷
          لازم نیست برای decrypt آن کاری انجام دهید. خودکار است. نیاز به تنظیم خاصی در برنامه ندارد.
  • مهمان در ۱۳۹۲/۰۳/۲۳ ۱۹:۲۶
    سلام؛ بنده از طریق کد میخوام کانکشن استرینگ رو رمز بکنم ولی هنگام ذخیره confg.Save(ConfigurationSaveMode.Full);   خطایی میده به این عنوان
    System.Security.Cryptography.CryptographicException: Object already exists
    چطوری می‌تونم اصلاحش کنم.با تشکر
    • وحید نصیری در ۱۳۹۲/۰۳/۲۳ ۲۰:۲۵
      یک سری بررسی سطح دسترسی و همچنین محافظت نشده بودن ابتدا باید انجام شود:
      var config =  ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
      var provider = "RsaProtectedConfigurationProvider";
      var connStrings = config.ConnectionStrings;
      if (connStrings != null)
      {
          if (!connStrings.SectionInformation.IsProtected) // اگر محافظت شده نبود
          {
              if (!connStrings.ElementInformation.IsLocked) // اگر از طرف هاست قفل نشده بود
              {
                  // Protect the section.
                  connStrings.SectionInformation.ProtectSection(provider);
      
                  connStrings.SectionInformation.ForceSave = true;
                  config.Save(ConfigurationSaveMode.Full);
              }
          }
      }
      • بهاره در ۱۳۹۲/۰۶/۲۲ ۱۰:۳۲
        سلام
        اگر پروژه از نوع sharepoint 2003 باشد،آیا این روش موثر است؟
        • محسن خان در ۱۳۹۲/۰۶/۲۲ ۱۱:۱۶
          شیرپوینت هم یک برنامه ASP.NET است.
      • خوزستان در ۱۳۹۴/۰۱/۱۰ ۱۶:۲۱
        برای رمزنگاری باید کد بالا که فرمودین  رو بصورت یک متد نوشت و آن را در Application_Start فراخوانی کرد ؟
        • محسن خان در ۱۳۹۴/۰۱/۱۱ ۲۰:۱
          هرجایی که دوست داشتی فراخوانیش کن. هیچ فرقی نمی‌کنه. فقط مهم اینه که هر تغییری در فایل web.config سبب ری استارت برنامه میشه. بنابراین اینکار یکبار باید انجام بشه و نه بیشتر.
  • مهمان در ۱۳۹۲/۱۱/۱۱ ۲۲:۱۸
    اگر ویندوز اپلیکیشن بود چی؟ می‌شه هم روش کامندی و هم برنامه نویسیش رو بگید؟ ممنون
    • محسن خان در ۱۳۹۲/۱۱/۱۱ ۲۲:۴۷
      فرقی نمی‌کنه. روش کدنویسی آن که در نظرات مطرح شده با تمام فایل‌های کانفیگ استاندارد کار می‌کند.