Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Пароль к программе


Автор: REVOLT 4.10.2004, 15:34
У меня есть программа, с базой данных, т.е. база Access отдельно от программы ( в томже каталоге), как сделать так чтобы доступ к базе данных из програмы был только через пароль, т.е. когда открывешь прогу, должно появиться окно ввода пароля и программа должна работать дальше, если парошь правельный, но а есле нет... Это я сделать могу. Но проблема собственно в том что если открыть базу данных, то с ней там можно творить всё что угодно, а мне нужно чтобы доступ к базе был также закрыт парольем тем же что и ропграмма.
Подскажите пожалуйста, Программисты добрые!

Автор: Akina 4.10.2004, 17:04
Цитата
с ней там можно творить всё что угодно

Ну... ее и удалить можно - тут никакой пароль не поможет...

Организуй шифрование данных по этому паролю...

Автор: REVOLT 4.10.2004, 18:51
Akina
Цитата
Организуй шифрование данных по этому паролю...

А это как???

sample.gif

В смысле примерчик не большой приведи?

Автор: cardinal 4.10.2004, 19:18
REVOLT, вот тебе один прикольный пример:
Цитата
Thanks to James Hansen.
The main program displays a string in Base64 encoding and then decodes the encoding to verify that it contains the correct string. It then repeats those steps for the BinHex encoding.

To encode in Base 64, the program makes an XML document and gives it an encode element of type bin.base64. It copies the string into an array of bytes, assigns it to the encoder, and reads the result from its Text property.

To decode the Base 64, the program makes an XML string containing the encoded information, loads it, and reads the decoder node's text.

The functions that encode and decode BinHex work similarly.

Код
Private Sub Form_Load()
Dim StringToEncode As String

   StringToEncode = "Hi James!"

   ' To Base64
   Debug.Print Encode(StringToEncode)
   Debug.Print Decode(Encode(StringToEncode))

   ' To Hex
   Debug.Print ToHex(StringToEncode)
   Debug.Print FromHex(ToHex(StringToEncode))
End Sub

Public Function Encode(ByVal iStr As String) As String
Dim iXml As New MSXML2.DOMDocument30
Dim iArray() As Byte

   With iXml.createElement("Encoder")
       .dataType = "bin.base64"
       ReDim iArray(LenB(iStr))
       CopyMemory iArray(0), ByVal StrPtr(iStr), LenB(iStr)

       .nodeTypedValue = iArray()
       Encode = .Text
   End With
End Function

Public Function Decode(ByVal iStrbase64 As String) As Byte()
Dim strXML As String

   strXML = "<DECODER xmlns:dt=" & Chr(34) & _
       "urn:schemas-microsoft-com:datatypes" & Chr(34) & " " & _
       "dt:dt=" & Chr(34) & "bin.base64" & Chr(34) & ">" & _
       iStrbase64 & "</DECODER>"
   With New MSXML2.DOMDocument30
       .loadXML strXML
       Decode = .selectSingleNode("DECODER").nodeTypedValue
   End With
End Function

Public Function ToHex(ByVal iStr As String) As String
Dim iXml As New MSXML2.DOMDocument30
Dim iArray() As Byte

   With iXml.createElement("Encoder")
       .dataType = "bin.hex"
       ReDim iArray(LenB(iStr))
       CopyMemory iArray(0), ByVal StrPtr(iStr), LenB(iStr)

       .nodeTypedValue = iArray()
       ToHex = .Text
   End With
End Function

Public Function FromHex(ByVal iStrbase64 As String) As _
   Byte()
Dim strXML As String

   strXML = "<DECODER xmlns:dt=" & Chr(34) & _
       "urn:schemas-microsoft-com:datatypes" & Chr(34) & " " & _
       "dt:dt=" & Chr(34) & "bin.hex" & Chr(34) & ">" & _
       iStrbase64 & "</DECODER>"
   With New MSXML2.DOMDocument30
       .loadXML strXML
       FromHex = _
           .selectSingleNode("DECODER").nodeTypedValue
   End With
End Function

Я подключил Msxml3.dll в References и все заработало.

Автор: REVOLT 4.10.2004, 19:56
cardinal, я понимаю твой профессионализм, а нельзя как кибудь по проще, для нацинающих butbut.gif

Автор: cardinal 4.10.2004, 20:13
Цитата(REVOLT @ 4.10.2004, 18:56)
cardinal, я понимаю твой профессионализм, а нельзя как кибудь по проще, для нацинающих

Спасибо конечно smile.gif , но на самом деле ничего сложного тут нет.

Все что тебя интересует здесь это вот эти две строки:
Код
Debug.Print Encode(StringToEncode)
Debug.Print Decode(Encode(StringToEncode))

Остальное ты берешь как есть и пользуешься.
Эти две строчки показывают тебе, что строка StringToEncode шифруется и расшифровывается правильно. А остальное это просто хитрое использование библы Msxml3.dll.
Засунь это все в проект и поставь breakpoint на первой из этих двух строк и нажми один раз Shift-F8. Посмотри на содержанием окна Immediate. Это твоя зашифрованная StringToEncode. Нажав второй раз Shift-F8 она расшифровывается и появляется в том же окне Immediate.
(Если ты не видишь окна Immediate на экране когда открыт проект, то нажми Ctrl-G и оно появится).

Не боись - прорвемся! smile.gif

Автор: boevik 4.10.2004, 20:18
По моему, REVOLT, хотел повесить пароль на файл mdb и сделать окошко авторизации в программе.

Автор: cardinal 4.10.2004, 21:11
Цитата(Akina @ 4.10.2004, 16:04)
Организуй шифрование данных по этому паролю...

Цитата(Akina @ 4.10.2004, 16:04)
А это как???

Цитата(REVOLT @ 4.10.2004, 17:51)
В смысле примерчик не большой приведи?

boevik, вот я и привел пример.
Цитата(boevik @ 4.10.2004, 19:18)
По моему, REVOLT, хотел повесить пароль на файл mdb и сделать окошко авторизации в программе.

Ну так я не вижу никакой проблемы в том, чтобы зашифровать базу самому. Причем зашифровать только важные столбцы например, а те в которых индекс стоит, оставить как есть. Причем база будет всегда зашифрованной, а вот когда данные будут читаться программой REVOLT'а они будут одновременно расшифровываться, но только для пользования внутри программы, а база меняться при этом не будет. Соответственно записывать данные в базу надо в зашифрованном виде.
boevik, а если ты имеешь в виду воспользоваться стандартными средствами Access под
Цитата(boevik @ 4.10.2004, 19:18)
хотел повесить пароль на файл mdb и сделать окошко авторизации в программе

, то я это так и делал по началу, но потом понял, что хакеры уже давным давно сделали всякие вскрывалки бд. smile.gif
А если сделать так, как я предлагаю, то еще придется голову почесать над тем, как же данные зашифрованы. smile.gif

Автор: REVOLT 5.10.2004, 12:30
cardinal,

Цитата
хотел повесить пароль на файл mdb и сделать окошко авторизации в программе


boevik, а ты меня понял, мне нужен пароль на базу данных и авторизация в пограмме.

Цитата

, то я это так и делал по началу, но потом понял, что хакеры уже давным давно сделали всякие вскрывалки бд.
А если сделать так, как я предлагаю, то еще придется голову почесать над тем, как же данные зашифрованы. 

Мнебы пока прмерчик по проще, а программа обычная, сверх сикретных даннех нет. Делаю программку на курсовую работу, мне это нужно для отвода глаз перпода ;) . cardinal, а как ты рашьше зашифроввывал.



Автор: Akina 5.10.2004, 13:32
REVOLT
Цитата
мне нужен пароль на базу данных

Ломается за 2 секунды

Цитата
авторизация в пограмме

MDW

Автор: REVOLT 5.10.2004, 13:36
Akina, ну и фиг с ней, скажите как сделать, наш препод, а точнее преподовательница это не заметит tounge.gif.


А ломается в блокноте есле не ошибаюсь? cool.gif

Автор: Akina 5.10.2004, 13:38
Цитата
А ломается в блокноте есле не ошибаюсь?

Есть куча прог. Стартуешь, тычешь мышом в БД, она тебе дает пару паролей, которые к ней подходят - один 8-символьный, другой строго буквоциферный.

Автор: REVOLT 5.10.2004, 13:49
Точно, вспомнил, есть даже на компе у меня biggrin.gif , так как её запаролеть, обычным методом, без подключения библиотек???
Подскажие плиз...

Автор: Akina 5.10.2004, 14:51
REVOLT
Ну я же тебе сказал - MDW. Файл рабочей группы. Почитай хелп, что ли...

Автор: REVOLT 5.10.2004, 15:37
Цитата
Ну я же тебе сказал - MDW. Файл рабочей группы. Почитай хелп, что ли...


Нафига тогда форум? mad.gif

Автор: Akina 5.10.2004, 17:02
REVOLT
И что? Я процитировать хелп сюда должен? Форум может и нафига, но уж точно не резиновый... сие раз. Два - так это то, что в хелпе ты инфу найдешь быстрее чем я отвечу (if). И три - кому охота помогать человеку, который сам не желает что-либо делать?
Резюме - форум для того случая когда все испробовано, но не помогло.

ИМХО конечно...

Автор: REVOLT 5.10.2004, 18:21
Во-первых я не знаю про какой хелп идёт речь?
Во-вторых я задал вопос как и многои участники форума.
Ну а в третих пробывал это:

Код

Option Explicit

Private WS As Workspace
Private DB As Database
Dim strDBPath As String
Dim strNewPwd As String

Private Sub Command1_Click()
Set WS = DBEngine.Workspaces(0)
Set DB = WS.OpenDatabase (strDBPath,True,False)
DB.NewPassword "111", strNewPwd
End Sub


Всёравно не фига не получается... hmmm.gif

Автор: cardinal 5.10.2004, 19:07
REVOLT, ну делал я раньше так:
пароль на базу ставил прямо в Access , а потом работал с ней через DAO (то есть подключить надо Microsoft DAO 3.6 Object Library. Вот как я открывал базу:
Код
Private mdb As dao.Database               'база данных

Private Sub Form_Load()
On Error Resume Next

Dim strConnect As String
Dim pwd As String

Text1.Text = "какой-нибудь пароль"
pwd = Text1.Text
strConnect = ";database=" & App.Path & "\db23.mdb" & ";PWD=" & pwd & ""  'data access with password"
On Error Resume Next
Set mdb = OpenDatabase("", True, False, strConnect)
If Err Then
lblLog.Left = 800
lblLog.Caption = "Неправильный пароль." 'Opening your Database failed."
'MsgBox "Вы ввели неправильный пароль", vbExclamation, "Защита доступа"
Else
Module1.ProgrammStart
End If
...

Все что здесь написано было сделано очень давно (примерно два месяца до того как я зарегистрировался на форуме) и поэтому... сильно не ругайтесь smile.gif Ну так... как пример использовать можно. thumbs-up.gif

Когда изучал базу пришел к выводу, что она зашифровывается, когда ты на нее ставишь пароль. Что как бы логично, иначе какой вообще смысл в пароле...

Автор: REVOLT 6.10.2004, 14:09
cardinal, спасибо помог, надал разбираться с твоим репвым примером, но тут теперь такой вопросик, не знаю ли стоит создавать ноавй топик, или сюда написать. Но я напишу наверное, вопрос на мой взгляд не вызовит больших дискуссий.

Есть два текстовых поля code и txtPassword
В txtPassword вводятся символы, а в этот момент в code перекодируются


Код
Option Explicit
Private Sub cmdOK_Click()
Dim pwl As Variant
code.Text = pwl
SaveSetting App.EXEName, "Code", "pas", pwl
End Sub

Private Sub txtPassword_Change()
code = Encode(txtPassword)
End Sub


Вы наверно поняли что мне хочется записать перекодированный пароль в реестра, как это сделать. Тот код который я привёл не работает. Где я допустил ошибку??? qstn.gif

Автор: cardinal 6.10.2004, 19:09
Код
Option Explicit
Private Sub cmdOK_Click()
Dim pwl As String
pwl = code.Text
SaveSetting App.EXEName, "Code", "pas", pwl
End Sub

Private Sub txtPassword_Change()
code.Text = Encode(txtPassword)
End Sub

Это я так... на работоспособность не проверял... Если не поможет, значит я тебя не понял smile.gif

Автор: REVOLT 6.10.2004, 19:45
cardinal, всё работает! Спасибо тебе, выручил очень!

Автор: cardinal 6.10.2004, 21:46
Ну вот, а ты боялся smile.gif

Автор: REVOLT 7.10.2004, 17:44
cardinal, я тут с реестром немного запутался.

вот код. Но почемуто программа не считывает данные из реестра

Код

Private Sub Form_Load()
If pass.Text = "" Then
 txtPassword.Visible = True
 cmdOK.Visible = True
 txtPass.Visible = False
   ope.Visible = False
End If

If pass.Text = GetSetting(App.EXEName, "Code", "pas") Then
   txtPassword.Visible = False
   cmdOK.Visible = False
   txtPass.Visible = True
   ope.Visible = True
End If
End Sub


Плдскажите почему в pass.Text не появляются данные из реестра.


Автор: cardinal 7.10.2004, 20:03
А это что за конструкция?
Код
If pass.Text = GetSetting(App.EXEName, "Code", "pas") Then ...

Отвыкай так писать, тогда и не будешь голову ломать на всякой ерундой... smile.gif

Вот пример:
Код
Option Explicit

Private Sub DeletePass_Click()
DeleteSetting App.EXEName, "Code", "pas"
End Sub

Private Sub GetPass_Click()
pass.Text = GetSetting(App.EXEName, "Code", "pas")
End Sub

Private Sub SetPass_Click()
Dim pwl As String
pwl = pass.Text
SaveSetting App.EXEName, "Code", "pas", pwl
End Sub

Автор: REVOLT 7.10.2004, 20:40
[quote]А это что за конструкция?


Код
Код
If pass.Text = GetSetting(App.EXEName, "Code", "pas") Then ...

[quote]

Ну это условие. Есле в текстровом поле символы такие же как и в реестре то поисходит условие.
Но это уже не важно. Писат стараюсь переучиваться
У меня всё получилось. Всёравно спасибо


Автор: cardinal 8.10.2004, 00:10
Цитата(REVOLT @ 7.10.2004, 19:40)
Есле в текстровом поле символы такие же как и в реестре то поисходит условие.

Понимаю... smile.gif То ли я на ручнике был, то ли что, но я почему то не был уверен, что это откомпилируется правильно. Вообщем в таком случае комментарий бы не помешал, а если без коментария, то я думаю лучше будет читаться так (твой код немного подправил):
Код
Private Sub Form_Load()
Dim SavedPwd As String
If pass.Text = "" Then
txtPassword.Visible = True
cmdOK.Visible = True
txtPass.Visible = False
ope.Visible = False
End If

SavedPwd = GetSetting(App.EXEName, "Code", "pas")
If pass.Text = SavedPwd Then
txtPassword.Visible = False
cmdOK.Visible = False
txtPass.Visible = True
ope.Visible = True
End If
End Sub

В этом случае все и без комментариев становится понятно.

Вот представляешься приперся я усталый домой и посмотрел в твой исходник smile.gif Я конечно согласен что протормозил, но ведь с кем не случается... Дело в том, что в Си оператор сравнения выглядит так: ==, а тут был знак =. Вот я что-то и подумал, что возвратит тебе операция присваивания...
Но думаю раз все таки случилось - значит надо написать по лучше thumbs-up.gif чтобы и ты сам через год после того как не видел этого кода (попрограммировав может даже на многих других языках) понял, что ты написал когда-то там...

Я сделал одну ошибку пару лет назад - плохо комментировал, плохо называл переменные, про редактировал исходники и т..д. - и на то, что тогда понаписал смотрю теперь с ужасом smile.gif

Автор: REVOLT 8.10.2004, 12:31
Спасибо тебе уважаемый Гуру, дописываю эту программу, а с новой всё начинаю коментировать правильно. Как ты правильно сказал сто чере год туда страшно глянут. Я уже недельки две колдую над программой. И туда ужестрашно залязить... biggrin.gif,а через год есле туда глянуть, то вообще заикаться можно начать biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)