Mã hóa chuỗi kết nối trong web.config

Mã hóa chuỗi kết nối trong web.config

Trong asp.net lưu trữ các thông tin cấu hình  trong các tập tin đơn giản được gọi là web.config và machine.config. Chúng lưu giữ tất cả thông tin quan trọng bao gồm chuỗi kết nối cơ sở dữ liệu, tên người dùng , mật khẩu cho các cơ sở dữ liệu. Đó là những thông tin nhạy cảm, vì vậy đôi khi ta muốn bảo mật những thông tin này.

Về điểm này Microsoft hỗ trợ rất tốt cho việc mã hóa cũng như giải mã bằng 2 kiểu sau:

RSAProtectedConfigurationProvider: Đây là kiểu mã hóa mặc định sử dụng thuật toán mã hóa và giải mã khóa công khai RSA.

- DataProtectionConfigurationProvider: sử dụng Windows Data Protection Application Programming Interface (DPAPI)  để mã hóa và giải mã.

Tính năng này có từ .NET Framework 2.0 (Visual Studio 2005)

Sau đây, hãy cùng tôi khám phá tính năng này bằng một ví dụ nho nhỏ.

Trước tiên, bạn hãy tạo 1 project web app, ở đây tôi đặt là EncryptOrDecryptConnectionString trong visual studio 2010.

Đây là chuỗi kết nối trong file web.config của tôi:


<connectionStrings>

<add name="NorthwindConnectionString" connectionString="Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=myuser;Password=mypassword"

providerName="System.Data.SqlClient" />

</connectionStrings>

Trong default.aspx:


<form id="form1" runat="server">

<div align="center">

<span style="font-weight: bold">Encrypt or decrypt connectionString</span> <br/><br/>

<asp:DropDownList ID="cmdProvider" runat="server">

<asp:ListItem>RSAProtectedConfigurationProvider</asp:ListItem>

<asp:ListItem>DataProtectionConfigurationProvider</asp:ListItem>

</asp:DropDownList> <br/>

<asp:Button id="btnEncrypt" runat="server" Text="Encrypt" onclick="btnEncrypt_Click" /> &nbsp;

<asp:Button ID="btnDecrypt" runat="server" Text="Decrypt" onclick="btnDecrypt_Click" />

</div>

<div align="center"><asp:Label runat="server" ID="lblConnectionString"></asp:Label></div>

</form>

Bạn thực hiện xử lý sự kiện cho 2 nút mã hóa và giải mã theo 1 trong 2 kiểu mã hóa trên.

Code:


//hàm mã hóa

protected void btnEncrypt_Click(object sender, EventArgs e)

{

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

ConfigurationSection section = config.GetSection("connectionStrings");

if (!section.SectionInformation.IsProtected)

{

section.SectionInformation.ProtectSection(cmdProvider.SelectedValue);

config.Save();

}

}

//hàm giải mã

protected void btnDecrypt_Click(object sender, EventArgs e)

{

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

ConfigurationSection section = config.GetSection("connectionStrings");

if (section.SectionInformation.IsProtected)

{

section.SectionInformation.UnprotectSection();

config.Save();

}

}

Thật đơn giản phải không? Và đây là kết quả cho 2 kiểu mã hóa trên.

+ Với trường hợp: RSAProtectedConfigurationProvider


<connectionStrings 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>kO1AtmrjphuDdUzpH2mahl06R1KY/yewY5Qzdxl5Ae+3G8uuKRz
5eD0JvJAMmO8E2jWEP6773QC1OY4FTQPOIBIXTNWUEJKNxpOF7G6YxfksrXK/fsQ5
twUXY/F7Cy+o9+Md9cgF9t8uuV3SYxyhouGJH6LGXdQcV0SFG4uLJkk=</CipherValue>

</CipherData>

</EncryptedKey>

</KeyInfo>

<CipherData>

<CipherValue>WrvU71vCJN4SsoBvAD1CgyPDyKuYibO+52vTt+7yslIi3pYr
HgKRlJOqyBd0zgVOVhU128OWMSds85uiJjo22Qcn7RIj0MLeIPraCKOOcQ8cp
hDsA1UmTzvPOo5RS1X8R4r0ukS/ygOn0nNc4tPYaoWVcnwnVF2u+p6TVO23ghtQwD
ZFqSq/qoZowavCNh82P0Hc78F7w+BGi23R5ds7DD57spu8X7T3rrDecudkEvcVOvHN1
gXYPy3bIme8mHNvYkaX5unZxgWf9m/iUosjk8Wa/JetpyVBqB6LI5tCG9Z4lt
SuPm0FFgrNmBjMfYFdhbuoh6cT6iE=</CipherValue>

</CipherData>

</EncryptedData>

</connectionStrings>

+ Với trường hợp DataProtectionConfigurationProvider


<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">

<EncryptedData>

<CipherData>

<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/wdDo6YynkKxAZR47EFZ1QQAAAA
CAAAAAAAQZgAAAAEAACAAAADKMIwaEwhJMNNcw4saBPY6YErQaO0u46ajeH4O0w9L9wAAA
AAOgAAAAAIAACAAAAAYVc3DG2jAwGA4nJNVxDAUNadmxd4VfA2dNlhyHGLBROABAAAF56
4c0J0KQ6b0aVz6VOGcZNH5lyl/GgIuG6VQyEqcMi6wQgjs147fPJaPJcaGImAvOIFvQB3
dHC19cwZ+eKHz/SSszk/GlXzDHlNr2vJdB9StjaXaN+SaYJFXxe6PTZvtyK3Gf/GA23tK
C18hyeIdnc2b/c5Gfu5rw7caooqeX2061aA48IIwilFyiX29pXJOWWxGsy8v8aV6lY53/
0pY5egS//unrpqfT7G1GHrissVDFaF4IkbiB/H+lWkKolOOsPhKs4Wdp2M6UVIECz6ZnD
+f+BCDNwsTjnN+t8hZBCt8rAvAB3xFA8n1mMP7NCblEYtagYVqgf6BVr0YvKoqcOWJJK5B
AwMvJhLZikASz8Vt+v35SJKMyaf5SarMfKc8FeCG1+3RcNaYcl/1Q17+2V7iPqCslVZS
gSZ5DWcDIX1L3Rd6hwzlIqMC1qaHqZ/t4IjjiV3m1SDWIFVpwaQ6+zcedKOxYS01tq1ao3
CA5Q/54byljAc0AFgsIPKrxpwnyDJwgFSeOmv4TNnsX9tKog2iP/MYKTLaZXbVtdGS9Nf3
73eFoovyP5eH+w8PBNIXlv/SKxCTELnelYqOMv2953PoZBCsDEvbn+0/7gA1DqBTE8iDO6
sE9DoKIa1YIr5AAAAAlXceK1Shh5sp1PsxLyAk+c+bUizlrvsIK4ZHgqx9y8GSVYVnu
yO5oNE5AZNEteo0cgH8HR0+fmD6DPhMkbtW/w==</CipherValue>

</CipherData>

</EncryptedData>

</connectionStrings>

Thật kỳ diệu, tuy nhiên bạn đang băn khoăn là lấy chuỗi kết nối bây giờ ra sao trong code của mình? Bạn không phải lo lắng về điều này vì cách lấy chuỗi kết nối vẫn không đổi.

ConfigurationManager.ConnectionStrings["NorthwindConnectionString"]
.ConnectionString;

Lưu ý:

Chúng ta không thể mã hóa được tất cả section trong web.config bằng cách trên như:

  • <processModel>
  • <runtime>
  • <mscorlib>
  • <startup>
  • <system.runtime.remoting>
  • <configProtectedData>
  • <satelliteassemblies>
  • <cryptographySettings>
  • <cryptoNameMapping>
  • <cryptoClasses>

Để mã hóa các section này bạn phải mã hóa giá trị của nó trong registry. Trong .net  framework có hỗ trợ tool mã hóa và giải mã aspnet_regiis.exe.

Bạn có thể tìm hiểu thêm cách sử dụng công cụ này.

Happy coding :)

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!