Помогите идеей с правами доступа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Помогите идеей с правами доступа

Сообщение Al Prad » 19.10.2007 (Пт) 10:00

Добрый день!
У программы есть несколько пользователей. Каждому пользователю соответствуют ИмяПользователя, Пароль и УровеньДоступа. Эти данные хранятся в mdb-файле. Пароль (числовой) хранится в слегка "зашифрованном" виде, т.е его надо сначала разделить на определенное число, затем отнять от результата другое число, и тогда только сравнивается результат с паролем, введенным пользователем с экрана. Т.е. Если найдется умный юзер и откроет базу данных в Аксессе, то чужой пароль все равно не узнает, если он не ходил в детстве математический кружок :).
А вот в поле "УровеньДоступа" хранится число от 1 до 9, по которому определяются права пользователя пользоваться теми или иными функциями программы. Так вот, умный юзер может вписать себе из Аксесса любой УровеньДоступа и нахулиганить. Если хранить УровеньДоступа в шифрованном виде, как Пароль, то это толку не даст, т.к. юзер просто скопирует Уровень из ячейки админа в свою ячейку и будет хихикать, потирая ручки.
Вопрос в сдедующем: как разграничить права доступа к разным функциям программы так, чтобы их никто не смог без меня переназначить. Понимаю, что все равно полностью никогда ничего не защитишь, но хотя бы на каком-то примитивном уровне хотелось бы.
Спасибо.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 19.10.2007 (Пт) 10:07

А если саму базу паролем защитить?
Подпись проходит рефакторинг

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 10:49

А разве пароль не ломается за два клика спецпрограммками, коих в сети немеряно?

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 11:11

Al Prad
ну так храни диапазон 1-9 в пароле юзера...
отведи ему позицию в строке и шифруй

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.10.2007 (Пт) 12:03

Автор походу тоже не ходил в математический кружок :)
Самый надежный способ - хранить в базе не просто поделенное/вычтенное число, а хеш пароля. Уровень доступа можно шифровать хешем (а еще лучше не хешем, а RSA), если значения уровня не используются внутри базы. Это запрещает хулиганить самому администратору под прикрытием чужого логина и одновременно не мешает менять уровни доступа.
Лучший способ понять что-то самому — объяснить это другому.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 14:02

Antonariy писал(а):Автор походу тоже не ходил в математический кружок :)
Самый надежный способ - хранить в базе не просто поделенное/вычтенное число, а хеш пароля. Уровень доступа можно шифровать хешем (а еще лучше не хешем, а RSA), если значения уровня не используются внутри базы. Это запрещает хулиганить самому администратору под прикрытием чужого логина и одновременно не мешает менять уровни доступа.


как раз ходил.
Кстати, никак не могу понять, что такое "походу"?
Последний раз редактировалось Al Prad 19.10.2007 (Пт) 14:20, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2007 (Пт) 14:12

Другими словами -- твой алгоритм скрытия пароля очень примитивный и легко декодируется. Для надежного скрытия следует использовать ассиметричные функции (хеш-функции).
Lasciate ogni speranza, voi ch'entrate.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 14:25

alibek
Это я понимаю, но мне сложнее и не надо, не такой уж тут ушлый народ. И не хочется заморачиваться с шифрованием, которое будет сложнее, чем сама программа. Не оценят.

kibernetics
А это может подойти как вариант...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2007 (Пт) 14:29

Если там такой глупый народ, то пароль на базу ничуть не худшее решение.
Lasciate ogni speranza, voi ch'entrate.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 14:47

alibek
Некоторые знают о существовании взломщиков файлов аксесса, но мысль о том, что пароль/уровень доступа зашифрованы уже отобьет у них охоту ковыряться. По кр. мере , мне так кажется....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2007 (Пт) 15:05

Если уж у человека хватило любопытства открыть базу и просмотреть содержимое таблицы учетных записей, то ему несложно будет и напрямую в базу вносить необходимые изменения. В крайнем случае поменяет пару раз пароль, посмотрит, что будет в базе и определит зависимость (а она будет линейной).
Хеш же, ничуть не усложняя программу, уберет зависимость.
Lasciate ogni speranza, voi ch'entrate.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 15:34

alibek
Ладно, согласен насчет хеширования пароля. А вот как быть с хешированным уровнем доступа - взломщик просто скопирует его из ячейки админа в в свою ячейку и ему даже не надо знать, что там за число такое запрятано.
Тут надо какое-то принципиально другое решение для хранения уровней доступа

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.10.2007 (Пт) 15:41

как раз ходил.

взломщик просто скопирует его из ячейки админа в в свою ячейку и ему даже не надо знать, что там за число такое запрятано.

Все-таки не ходил :D

Уровень доступа каждого из пользователей шифруется собственным хешем - для каждого пользователя одно и то же значение уровня будет иметь разный вид. После копирования его из чужой записи при расшифровке получится другой результат, на правильное значение никак не похожий.
Лучший способ понять что-то самому — объяснить это другому.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 15:50

Antonariy
Ну тебя. Проходил мимо-и проходи.
Буду я заморачиваться на разные хеши для разных пользователей, которых может быть неопределенное число.

дай лучше людям предложить другие идеи.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.10.2007 (Пт) 16:10

Вот тебе простейший хеш crc32 (сделать модуль):
Код: Выделить всё
Option Explicit
Dim CrcTableInit As Boolean
Dim CRCTable(0 To 255) As Long
Dim lb1() As Byte
Dim lb2() As Byte

Public Function calcCRC32(ByteArray() As Byte) As Long
Dim i As Long
Dim crc As Long
Dim Z As Long
Dim t As Date
    If CrcTableInit = False Then Call Init_CRCTable
    crc = -1
    For i = 0 To UBound(ByteArray) - 1
        crc = (((crc And &HFFFFFF00) \ &H100) And &HFFFFFF) Xor (CRCTable((crc And &HFF) Xor ByteArray(i)))
        crc = crc Xor ByteArray(i)
    Next i
    crc = crc Xor &HFFFFFFFF
    calcCRC32 = crc
End Function

Private Sub Init_CRCTable()
Dim i As Long
Dim j As Long
Dim Limit As Long
Dim crc As Long
    Limit = &HEDB88320
    For i = 0 To 255
        crc = i
        For j = 0 To 7
            If crc And 1 Then
              crc = (((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF) Xor Limit
            Else
              crc = ((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF
            End If
        Next j
        CRCTable(i) = crc
    Next i
    CrcTableInit = True
End Sub

Вот тебе простейший алгоритм шифрования RC4 (сделать класс):
Код: Выделить всё
Option Explicit

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private m_Key As String
Private m_sBox(0 To 255) As Integer
Private byteArray() As Byte
Private hiByte As Long
Private hiBound As Long

Public Function EncryptString(Text As String, Optional Key As String, Optional OutputInHex As Boolean) As String
Dim byteArray() As Byte
    byteArray() = StrConv(Text, vbFromUnicode)
    Call EncryptByte(byteArray(), Key)
    EncryptString = StrConv(byteArray(), vbUnicode)
    If OutputInHex = True Then EncryptString = EnHex(EncryptString)
End Function

Public Function DecryptString(Text As String, Optional Key As String, Optional IsTextInHex As Boolean) As String
Dim byteArray() As Byte
    If IsTextInHex = True Then Text = DeHex(Text)
    byteArray() = StrConv(Text, vbFromUnicode)
    Call DecryptByte(byteArray(), Key)
    DecryptString = StrConv(byteArray(), vbUnicode)
End Function

Public Sub EncryptByte(byteArray() As Byte, Optional Key As String)
Dim i As Long, j As Long, Temp As Byte, Offset As Long, OrigLen As Long, CipherLen As Long, CurrPercent As Long, NextPercent As Long, sBox(0 To 255) As Integer
    If (Len(Key) > 0) Then Me.Key = Key
    Call CopyMem(sBox(0), m_sBox(0), 512)
    OrigLen = UBound(byteArray) + 1
    CipherLen = OrigLen
    For Offset = 0 To (OrigLen - 1)
        i = (i + 1) Mod 256
        j = (j + sBox(i)) Mod 256
        Temp = sBox(i)
        sBox(i) = sBox(j)
        sBox(j) = Temp
        byteArray(Offset) = byteArray(Offset) Xor (sBox((sBox(i) + sBox(j)) Mod 256))
        If (Offset >= NextPercent) Then
            CurrPercent = Int((Offset / CipherLen) * 100)
            NextPercent = (CipherLen * ((CurrPercent + 1) / 100)) + 1
        End If
    Next
End Sub

Private Sub Reset()
    hiByte = 0
    hiBound = 1024
    ReDim byteArray(hiBound)
End Sub

Private Sub Append(ByRef StringData As String, Optional Length As Long)
Dim DataLength As Long
    If Length > 0 Then DataLength = Length Else DataLength = Len(StringData)
    If DataLength + hiByte > hiBound Then
        hiBound = hiBound + 1024
        ReDim Preserve byteArray(hiBound)
    End If
    CopyMem ByVal VarPtr(byteArray(hiByte)), ByVal StringData, DataLength
    hiByte = hiByte + DataLength
End Sub

Private Function DeHex(Data As String) As String
Dim iCount As Double
    Reset
    For iCount = 1 To Len(Data) Step 2
        Append Chr$(Val("&H" & Mid$(Data, iCount, 2)))
    Next
    DeHex = GData
    Reset
End Function
Private Function EnHex(Data As String) As String
Dim iCount As Double, sTemp As String
    Reset
    For iCount = 1 To Len(Data)
        sTemp = Hex$(Asc(Mid$(Data, iCount, 1)))
        If Len(sTemp) < 2 Then sTemp = "0" & sTemp
        Append sTemp
    Next
    EnHex = GData
    Reset
End Function

Private Property Get GData() As String
Dim StringData As String
    StringData = Space(hiByte)
    CopyMem ByVal StringData, ByVal VarPtr(byteArray(0)), hiByte
    GData = StringData
End Property

Public Property Let Key(New_Value As String)
Dim a As Long, b As Long, Temp As Byte, Key() As Byte, KeyLen As Long
    If (m_Key = New_Value) Then Exit Property
    m_Key = New_Value
    Key() = StrConv(m_Key, vbFromUnicode)
    KeyLen = Len(m_Key)
    For a = 0 To 255
        m_sBox(a) = a
    Next a
    For a = 0 To 255
        b = (b + m_sBox(a) + Key(a Mod KeyLen)) Mod 256
        Temp = m_sBox(a)
        m_sBox(a) = m_sBox(b)
        m_sBox(b) = Temp
    Next
End Property
Заморочек, которых ты так панически боишься, остается на полтора десятка строк кода.

А остальные предложат тебе не заниматься ерундой.
Лучший способ понять что-то самому — объяснить это другому.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.10.2007 (Пт) 16:16

Разделить базу на код и данные. Код - в MDE - юзер посмотреть/изменить его уже не сможет. MDB-шку с данными спрятать на сервере в каталоге у которого для юзеров стоит запрет на List - юзер элементарно ее найти не сможет.

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

Как такой вариант?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Сообщение Al Prad » 19.10.2007 (Пт) 16:34

Andrey Fedorov
Вообще-то база и программа лежат на сервере, а у юзеров право только запустить эту программу, и кроме нее они вообще ничего не видят :)
Так что я в принципе просто пытаюсь перестраховаться.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2007 (Пт) 18:28

Ты его совершенно не понял.
Тебе, кстати, уже дали два хороших решения. Этого более чем достаточно.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 58

    TopList  
cron