Mã hóa chuỗi kết nối VB.net + Sql Server

Liên hệ QC
Bạn có thể tìm hiểu qua mạng, có nhiều bài viết về nó, trước mình có dùng cái này, nhưng nhược điểm là nó đi theo máy, bây h thấy giải pháp dùng RSA.

 
Chiếu theo lời của bài #19 thì thớt chưa nắm vững dot NET và Visual Studio.
Nên nghiên cứ kỹ lại đi. Nhất là phần nhiệm vụ của config.
Gửi anh

Đúng là em chưa nắm chắc kiến thức Dot Net ạ.

Em có thể mô tả lại thế này ạ:
- Khi lập trình trong setting:
Name: Kho_A Type: String Scope là User( chứ không phải là Application) Value: "" ( Để trống)
- Sau khi chạy chương trình, người dùng lưu Kho_A = "ABC" => My.Settings.Save()
- Lần tiếp theo mở chương trình nên thì đã load được cấu hình trước đó Kho_A = "ABC"

- Ban đầu ntn:
<setting name="Kho_A" serializeAs="String">
<value />
- Người dùng cấu hình "Kho_A ="ABC" => Lưu lại => lẽ ra mở file .config lên nó phải là như thế này:

<setting name="Kho_A" serializeAs="String">
<value>ABC</value>

Tại sao em mở ra nó vẫn như ban đầu
<setting name="Kho_A" serializeAs="String">
<value />


Em sẽ tìm hiểu lại như gợi ý của anh:

"Nên nghiên cứ kỹ lại đi. Nhất là phần nhiệm vụ của config."

Em cảm ơn nhiều
 
Bỏ cái yêu cầu đó đi bạn, vô ích.
 
Chiếu theo lời của bài #19 thì thớt chưa nắm vững dot NET và Visual Studio.
Nên nghiên cứ kỹ lại đi. Nhất là phần nhiệm vụ của config.
Oài. Cảm ơn anh. Em tìm hiểu lại thì dữ liệu người dùng cấu hình được lưu tại ổ C thư mục AppData/Local..... Chứ không lưu vào file .config cùng thư mục với file .Exe
 
Anh có thể hướng dẫn em cách làm với VB.net không ạ. Cái anh làm bên trên hình như là Asp.net.
Với lại anh nghiên cứu giúp em cái file setting với ạ ( Cũng là file Xml nhưng cái này nó khác với cái file xml mà mình tự làm).

Em cảm ơn anh nhiều.
Rút kinh nghiệm là bỏ công ra tìm tòi mà bị nói sai dù chưa bạn thử nên lần này tôi nói vắn tắt như thế này.
Nếu chương trình bật lên mà kiểm tra:
  • settings đã lưu chuỗi kết nối thì bỏ qua,
  • còn chưa có thì bạn sẽ nạp vô thông qua 1 textbox hoặc 1 file bí mật hoặc cách nào đó
Như vậy cái chuỗi của bạn sẽ không hiện nội dung ở đâu trong codechương trình cả. Và nếu ai đó copy app của bạn qua máy hay user khác thì nó sẽ phải nạp lại chuỗi đó. Như vậy tính bảo mật khá tốt. Còn nếu ai đó tìm cách cuỗm settings của bạn thì tôi không chắc là họ đã biết tìm chỗ nào, mà nếu tìm được thì có đọc được gì không vì chính tôi cũng không đọc ra cái tôi nạp trong đó.
 
Rút kinh nghiệm là bỏ công ra tìm tòi mà bị nói sai dù chưa bạn thử nên lần này tôi nói vắn tắt như thế này.
Nếu chương trình bật lên mà kiểm tra:
  • settings đã lưu chuỗi kết nối thì bỏ qua,
  • còn chưa có thì bạn sẽ nạp vô thông qua 1 textbox hoặc 1 file bí mật hoặc cách nào đó
Như vậy cái chuỗi của bạn sẽ không hiện nội dung ở đâu trong codechương trình cả. Và nếu ai đó copy app của bạn qua máy hay user khác thì nó sẽ phải nạp lại chuỗi đó. Như vậy tính bảo mật khá tốt. Còn nếu ai đó tìm cách cuỗm settings của bạn thì tôi không chắc là họ đã biết tìm chỗ nào, mà nếu tìm được thì có đọc được gì không vì chính tôi cũng không đọc ra cái tôi nạp trong đó.

Gửi anh

Không phải là em chưa thử cách của anh. Em chạy dòng bên dưới nó báo lỗi: ( Đã sửa đường dẫn thư mục chứa web.config rồi)

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" "D:\3. Lập Trình\VB.net\File New 2\Test1\Test1\bin\Debug\Web.config" -prov "DataProtectionConfigurationProvider"

Lỗi ntn: Em thấy lỗi ở Aspnet_regiis. thì nghĩ rằng cái này dùng cho Asp.net.

1569308012692.png

Anh xem hộ em chuỗi bên trên em sửa đã đúng chưa ạ.

Em cảm ơn
 
Nói ra thì thế nào cũng bị cười chê, VDTT thử encrypt app.config theo hướng dẫn của mấy anh Tây mà mất nửa buổi hôm qua để tìm hiểu và thực hành tưởng thành công rồi mà hôm nay mở ra vẫn báo lỗi. Hôm nay lại lọ mọ thêm 10 phút rồi rút ra trình tự encrypt thế này:

Bước 1: Copy app.config thành 2 file là web.config và backup.config (VDTT tự nghĩ ra thêm backup.config cho an toàn).

Bước 2: Mở cmd và chạy dòng lệnh theo cú pháp như sau:
Mã:
%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" "Thư\mục\chứa\web.config\đặt\trong\nháy\kép\nhá" -prov "DataProtectionConfigurationProvider"

Bước 3: Xóa đi app.config và đổi web.config thành app.config

Bước 4: Biên dịch lại chương trình hoặc thay thế nội dung file xxx.config (xxx là tên chương trình bạn tạo ra) bằng nội dung của web.config sau encrypt

Và để minh họa, mình có 1 file app.config nội dung:
XML:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    .......
    <connectionStrings>
      <add name="Name"
       providerName="System.Data.OleDb"
       connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=db.accdb;" />
    </connectionStrings>
</configuration>
Sau khi chạy lệnh thu được:
XML:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  .......
   <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
     <CipherData>
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAT2XWu2Q55USZAVHiBh1lPgQAAAACAAAAAAAQZgAAAAEAACAAAACbx2rmanpxDfRV2d/9QZil5LTApB7VfG23wu4rxfUskQAAAAAOgAAAAAIAACAAAAAb7/q6v5zAX/9Av6G33wwnKp9H2+sLve5R/Ch1Y6Xo9WABAAAu9iWEy2uwEYPFTtm/WI7/Bf9R24Y74SePpPCoCBZawQnNqdxoR48ta9hWFmesDPese5OJZGsSrcE1WSdTJV3xzEsYCzNjDurnZ0y3mbbj/98rm93q6eP8HrrZdepNrw8Lvjl6Eq9WiSwUvFaeZcuBvaxZy4g32iYw9ADSoHX0+s5vvhS86fHinCS+zPA5O0t9lM1/8I2DP82NEt9VXdUS19unVHN1KwCgUJ8WWArp/6uFz8JXAo2Nmkbw3FTX5MQwwnUVw3U/w45qDQE21geLEh8Ox4Jn5a1bMQFKbFDWUOvEiMbIyQRbhhJeJkPNOzaj2WeuP+HPSLbHY2cQ6KMKeE0pwgO8zwc3HunCGBMdASveztXwVDpjvkUkqGmemrg9kQacK4S2cBIu8wi1JkEZOE6PW+ooBQ02h5ptPa7eACHaDzATjndFTqfWY/TrQXK2KS+bX4s9sLd356omL0eCQAAAAMlFe4sgFvZ89DminsY5MT9FWJv6HT+/rAXZ9Jm4QUx8EbtB7iJopVbNkDqMwJjqyZ3ntE1tbHd/CyKlFOctvmk=</CipherValue>
     </CipherData>
    </EncryptedData>
  </connectionStrings>
</configuration>
Chuỗi kết nối

Bây giờ đang nằm trong đống

Đấy là cách giải quyết theo nguyện vọng của bạn. Tuy nhiên VDTT tôi phát hiện ra là bạn biết dùng Settings thế thì tại sao bạn lại không dùng ngay cách đó để lưu trữ chuỗi bí mật của mình? Tôi đang mò mẫm lại settings này để có cái minh họa cho bạn.
Gửi anh

Em đã thay đổi phiên bản Đốt nét của em V4 : %windir%\Microsoft.NET\Framework\v2.0.50727 => %windir%\Microsoft.NET\Framework\v4.0.30319 thì thấy chạy được không báo lỗi nhưng vẫn chưa thấy mã hóa được gì. Em thử lại mấy lần nữa xem em đang sai ở đâu rồi thông tin sau ạ.

Em cảm ơn
 
Gửi anh

Em đã thay đổi phiên bản Đốt nét của em V4 : %windir%\Microsoft.NET\Framework\v2.0.50727 => %windir%\Microsoft.NET\Framework\v4.0.30319 thì thấy chạy được không báo lỗi nhưng vẫn chưa thấy mã hóa được gì. Em thử lại mấy lần nữa xem em đang sai ở đâu rồi thông tin sau ạ.

Em cảm ơn
Một project có 2 file config lận một cái tên là app.config và một cái tên_app.config khi biên dịch thì cái app.config sẽ thay thế cái tên-app.config. Tôi thử theo đúng thư mục v4.0.30319 thì kết quả vẫn tốt. Bạn làm sao mà ra kết quả như thế này mời là đúng nhé
SÊ EM MỜ ĐÊ đã viết:
Microsoft (R) ASP.NET RegIIS version 4.0.30319.0
Administration utility to install and uninstall ASP.NET on the local machine.
Copyright (C) Microsoft Corporation. All rights reserved.
Encrypting configuration section...
Succeeded! /Nhớ là có cái chữ Suceeded!/
Thấy có người chê bai bạn nhưng tôi thấy bạn vẫn có khả năng hơn ối vị (ít nhất cũng hơn tôi). Lúc trước tôi tốn mấy ngày mới tìm ra cái location của settings mà bạn mất chưa đầy 1 ngày. Biết biến từ v2.0.50727 -> v4.0.30319 là cũng nhạy bén rồi. Phát huy tiếp là giải quyết được thôi.
 
Một project có 2 file config lận một cái tên là app.config và một cái tên_app.config khi biên dịch thì cái app.config sẽ thay thế cái tên-app.config. Tôi thử theo đúng thư mục v4.0.30319 thì kết quả vẫn tốt. Bạn làm sao mà ra kết quả như thế này mời là đúng nhé Thấy có người chê bai bạn nhưng tôi thấy bạn vẫn có khả năng hơn ối vị (ít nhất cũng hơn tôi). Lúc trước tôi tốn mấy ngày mới tìm ra cái location của settings mà bạn mất chưa đầy 1 ngày. Biết biến từ v2.0.50727 -> v4.0.30319 là cũng nhạy bén rồi. Phát huy tiếp là giải quyết được thôi.
Gửi anh
Dòng lệnh của anh thực chất là trỏ đến file chứa trong thư mục nào đó để thực thì lệnh nào đó thôi. Em tìm thì máy em folde ver V4... mới có file Asapnet.... nên em thay vào ấy mà=> Cái này cũng không có gì nhạy bén cả.
Có lẽ chắc em làm ở máy công ty ( Ko có quyền Admin) nên chạy nó hiện màn hình command đen nên rồi tắt luôn=> Chẳng thấy file thay đổi gì => Cái này để về nhà thử lại.

Quả thực là em chưa nắm vững đốt nét + VS đâu. Ngày đi làm ( Việc chẳng liên quan đến IT+ lập trình) có thời gian rảnh thì tìm hiểu thôi. Cũng nhờ diễn đàn nên biết VBA => Đem toàn bộ kiến thức VBA tìm hiểu VB.net => Sau đấy tìm hiểu SQL server => Giờ cũng biết được đôi chút ( Cũng viết được 1 số chương trình phục vụ cho công việc của mình)( Dân gà mờ nên em mới không sợ người khác xem code mà chỉ cần bảo mật được chuỗi kết nối - Để bảo mật dữ liệu thôi) => Tóm lại em chỉ là dân du kích không phải chuyên nghiêp. Nên mong các anh chỉ giáo giúp.

Em cảm ơn
 
Nếu bạn không phải chuyên lập trình thì tốt hơn hết nên tiếp xúc thẳng với admin của SQL Server mà nhờ họ giúp. Một admin xứng đáng của SQLS dẫu không chuyên VS và dot NET thì cũng tự biết tự bảo vệ "bầy trâu" của mình và có những phương án tương đối hiệu quả.

Chú thích 1: sở dĩ bạn thấy khó hỏi ở các diễn đàn khác là vì cách trình bày của bạn không rõ rệt.
 
Chào anh chị em.
Lâu lắm mới trở lại chủ để này.
Em cũng đã tìm hiểu các cách anh chị giúp đỡ bên trên nhưng có lẽ nó không phù hợp với trường hợp của em. Nếu view được mã nguồn thì sẽ xem được chuỗi kết nối thôi.
Vì vậy thay vì cố che giấu chuỗi kết nối thì em có giải pháp khác và đang áp dụng như bên dưới.

- Viết Stored Procedures tại SQL
- Tạo User SQL chỉ phân quyền duy nhất EXEC Stored Procedures (Ví dụ : User_Login)
- Ở ứng dụng VB.net chỉ có gọi Stored và truyền tham số thôi. ( Nó như là ứng dụng giao diện)
- Giống mô hình 3 lớp VB.net mà mọi người thường nói.

Kết quả ( Đã test thực tế)
- Đăng nhập tài khoản User_Login vào SQL server thì không thể chỉnh sửa cài đặt hay tác động trực tiếp vào Table dữ liệu
- Cho dù có view được code=> Biết chuỗi kết nối cũng không làm được gì vì thao tác hoàn toàn khống chế qua Stored Procedures => Không thể truy cập trực tiếp vào cơ sở dữ liệu trong Server.

Dành cho bạn nào chưa biết hoặc đang tìm hiểu. ví dụ: Insert thôi nhé !

B1: Tạo User Login SQL server như bình thường không phân quyền gì hết. Ví dụ tạo user: User_Login
Chạy dòng này trong SQL để phân quyền Exc Stored Procedures (Quyền thực thi Stored)
Mã:
USE [Tên Databases]
GRANT EXEC TO [User_Login]
go
B2: Viết Stored Procedures trong SQL server ( Tạo Table ABC có 3 trường : Name varchar(50),Age int,Note Varchar(150))

Mã:
create proc Dbo.Insert_Name
@Name varchar(50),@Age int,@Note Varchar(150)
as
Begin
Insert into Dbo.ABC (Name,Age,Note) values(@Name,@Age,@Note)
End
go

B3: Viết ứng dụng VB.net

B3-1: Viết trong Module
Mã:
Imports System.Data.SqlClient
Imports System.Data
Imports DataTable = System.Data.DataTable
Module Module1
    Public connectString As String
    Public Sql As String
    Public cnn As SqlConnection
    Public Sub Ket_noi()
        connectString = "Data Source=Tên máy chủ, Cổng Port\SQLEXPRESS;Initial Catalog=Test;User ID= 'User_Login';Password='User_Login'"
        cnn = New SqlConnection(connectString)
        If cnn.State = ConnectionState.Closed Then
            cnn.Open()
        Else
        End If
    End Sub
    Public Sub Dong_Ket_noi()
        If cnn.State = ConnectionState.Open Then
            cnn.Close()
        Else
        End If
    End Sub

B3-2: Viết trên Form

Mã:
Imports System.Data.SqlClient

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Ket_noi()
        Dim Cmd As SqlCommand = cnn.CreateCommand()
        Dim transaction As SqlTransaction
        transaction = cnn.BeginTransaction ' Bắt đầu Transaction.
        Cmd.Connection = cnn
        Cmd.Transaction = transaction
        Try
            Cmd.CommandText = "Insert_Name"
            Cmd.CommandType = CommandType.StoredProcedure
            Cmd.Parameters.AddWithValue("name", "1")
            Cmd.Parameters.AddWithValue("age", "200")
            Cmd.Parameters.AddWithValue("Note", "3")
            Cmd.ExecuteNonQuery()
            Cmd.Dispose()

            transaction.Commit()
            MsgBox("OK")
        Catch ex As Exception
            transaction.Rollback()
            MsgBox("Có lỗi")
        End Try
        Dong_Ket_noi()
    End Sub
    End Class


Không biết em có hiểu sai cái phân quyền SQL không. Em biết Xử lý Stored, Viết lệnh... Nhưng cái phân quyền theo cách này không chắc chắn lắm. Không biết có gì " Mập mờ" bên trong mà em không biết không.

Rất mong sự chỉ dạy của các anh chị.

Em cảm ơn.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom