2016-12-12 1 views
2

많은 사람들과 공유해야하는 VBA의 ADO (ActiveX Data Objects)를 통해 SQL Server에 연결되는 Excel 스프레드 시트 (.xlsb)가 있습니다. 어떻게 내 SQL 사용자 이름과 암호를 보호하고 그들에게 액세스하는 것을 제 3 자 않도록 보관하지Excel VBA 프로젝트에서 ADO 연결을 보호하는 방법은 무엇입니까?

' Create the connection string. 
sConnString = "Provider=SQLOLEDB;" & _ 
       "Data Source={server name};" & _ 
       "Initial Catalog={database name};" & _ 
       "UserId={username};" & _ 
       "Password={password};" 

: 코드는 데이터베이스을 연결하기 위해 다음과 같은 문자열을 사용? 패스워드로 VBA 프로젝트를 충분히 보호하고 있거나 쉽게 금이 갈 수 있습니까?

+0

DBA에게 사용자가 볼 수있는 데이터에 대한 액세스 만 제공하는 로그인에 대해 생각해 보셨습니까? DB 및 해당보기의 데이터에만 액세스 할 수있는 계정의보기가 있습니다. –

+0

SQL Server의 시스템/사용자 ID를 기반으로 보안을 제한 할 수 있습니까? –

+0

@RobinMackenzie 내가 사용하고있는 계정은 이미 읽기 전용이지만 누구도 로그인 세부 정보를 볼 수 없도록하고 싶습니다. –

답변

2

VBA 프로젝트는 보호 충분하지 않습니다 : - 2 시간 무료 시간과 인터넷을 가진 사람은 아마 통해 갈 수 있습니다.

다른 권한을 가진 DB 수준에서 다른 사용자를 만드는 것이 기본 시나리오입니다. 그런 다음 Excel 스프레드 시트의 사용자에게 셀 및 사용자 양식 중 하나에 암호와 사용자 이름을 제공하도록 요청하십시오. 암호와 사용자 이름을 가져와 연결 문자열에 사용하십시오.

보안에 대한 추가 단계로서, 작은 012 속임수를 사용하여 salting이라고 할 수 있습니다. 예 : 주어진 사용자의 비밀번호가 vityata이라고 가정 해 보겠습니다. 그런 다음 사용자에게 입력하도록 요청하십시오. 들어가면 암호를 가지고 다른 암호로 변경하십시오. 이 다른 것은 데이터베이스에 대한 암호 여야합니다.

Public Function str_generator(ByVal str_value As String, ByVal b_fix As Boolean) As String 

    Dim l_counter As Long 
    Dim l_number As Long 
    Dim str_char As String 

    On Error GoTo str_generator_Error 

    If b_fix Then 
     str_value = Left(str_value, Len(str_value) - 1) 
     str_value = Right(str_value, Len(str_value) - 1) 
    End If 

    For l_counter = 1 To Len(str_value) 
     str_char = Mid(str_value, l_counter, 1) 
     If b_is_odd(l_counter) Then 
      l_number = Asc(str_char) + IIf(b_fix, -2, 2) 
     Else 
      l_number = Asc(str_char) + IIf(b_fix, -3, 3) 
     End If 

     str_generator = str_generator + Chr(l_number) 

    Next l_counter 

    If Not b_fix Then 
     str_generator = Chr(l_number) & str_generator & Chr(l_number) 
    End If 

    On Error GoTo 0 
    Exit Function 

str_generator_Error: 

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure str_generator of Function Modul1" 

End Function 

Private Function b_is_odd(l_number As Long) As Boolean 

    b_is_odd = l_number Mod 2 

End Function 

이의 사용자 암호가 vityata이라고 가정 해 봅시다 :이 같은 것을 의미한다. 그런 다음 사용자가 데이터베이스를 입력하면 데이터베이스의 실제 암호 인 cxlv|cwcc으로 변경됩니다.

?str_generator("vityata",false) 
cxlv|cwcc 
?str_generator("cxlv|cwcc",true) 
vityata 

마지막으로 - https://github.com/Vitosh/VBA_personal/blob/6750f76e85540829056e7889c489a65daf85c696/cls_Connection.vb - 내 클래스 연결이처럼 보이는 방법이있다. 당신이 개선을위한 아이디어가 있다면, 나는 끌어 오기 요청을 보게 될 것이 기쁘다.

+1

좋은 코드 -하지만 암호를 다시 해결할 수있는 액세스 권한이 있습니다 ... –

+0

그건 100 % 사실입니다. 그러나 최소한 일반 텍스트로 암호를 넣지 마십시오. – Vityata

+0

모호함을 통한 보안 - DB에 핵 암호가 있다면 어떨까요? –

2

VBA 암호 보호는 쉽게 우회되므로 안전한 것으로 간주 할 수 없습니다.

VBA 코드에 일종의 난독 화 (해시 함수 또는 유사)를 추가하여 암호가 일반 텍스트로 표시되지 않도록 할 수 있지만 VBA에 익숙한 사람은이 문제를 해결할 수 있어야합니다. 약간의 시간.

필자는 필요한 데이터 만 포함하는 뷰를 사용하여 db에 대한 액세스를 제한하려고합니다.

dll에 연결 기능을 넣으면 암호를 숨길 수 있습니다. 그러면이 기능을 VBA 코드에서 참조합니다. 이 작업을 수행하려면 더 많은 작업이 필요하며 실제로 자격 증명을 숨길 수있는 가능성이 훨씬 더 큽니다. 이 대답을 참조하십시오 : https://stackoverflow.com/a/19163256/5970009

+0

dll에 연결 기능을 넣는 것에 대해 생각하지 않았습니다. 이것은 유망 해 보입니다. 나는 그것을 들여다 볼 것이다. 감사! –

관련 문제