На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
  
    > Новый способ хранения персональных данных
      В базе данных персональные данные должны сохраняться в следующем виде:
      1) Вымышленные персональные данные, которые по внешнему виду не отличимы от действительных персональных данных. Например, реальная фамилия Петров может храниться в виде фамилии Медведевский или Obama или любой другой. Размер реальной фамилии и размер вымышленной фамилии между собой никак не связаны.
      2) Набор целых чисел от 1 до 65535 в количестве, равному размеру реальных персональных данных. Например, для фамилии Петров - это 6 чисел, так как в фамилии Петров 6 букв, примерно таких: 111, 75, 71, 29, 100, 211.
      Больше ничего в базе данных не должно сохраняться.
      Для восстановления реальных данных из вымышленных необходимо в оперативной памяти компьютера хранить алфавит - перечень символов, используемых для отображения персональных данных. Максимум - это 65535 символов в кодировке Unicode. Порядок следования символов в алфавите имеет первостепенное значение. Набор чисел в приведенном выше примере для фамилии Петров - это связь между адресами букв реальной фамилии Петров в алфавите и адресами букв вымышленной фамилии Медведевский в алфавите. Алфавит отличается от шрифта тем, что символы в алфавите различаются только по коду и порядок следования символов произвольный. Начертания символов не имеет никакого значения для алфавита. В шрифте начертания символов имеет первостепенное значение и порядок следования символов единственный.
      Адреса букв в алфавите и реальные буквы между собой никак не связаны.
      Если хакеры украдут из базы данных вымышленную фамилию Медведевский или Obama и украдут набор чисел 111, 75, 71, 29, 100, 211, то восстановить реальную фамилию Петров не смогут, так как отсутствует алфавит. А украсть алфавит из оперативной памяти практически невозможно.
      Если изменить в алфавите порядок следования символов, то это будет уже другой набор чисел для фамилии Петров. Можно время от времени изменять алфавит и заменять наборы чисел в базе данных для персональных данных. Вымышленные персональные данные можно не изменять.
      Как видите, украсть персональные данные невозможно, так как их попросту нет. Кража вымышленных персональных данных в этом случае бессмысленна. Под персональными данными мы понимаем в том числе пароли, логины, аккаунты и т.п.
      Алгоритм отображения информации.
      Алфавит - перечень символов, встречающихся в текстах. Каждый символ в алфавите встречается только один раз. Алфавит содержит не только прописные и строчные буквы, но символы знаков препинания, пробел, символы перевода каретки, символы новой строки и т.п. Каждый символ в алфавите имеет адрес, который изменяется от 1 - первый слева символ в алфавите, до N - последний слева символ в алфавите.
      Рассмотрим пример.
      Пусть имеем два слова: Путин, Медведев. В этих словах имеются следующие символы: П, у, т, и, н, М, е, д, в. Этот набор символов называется собственным алфавитом слов Путин и Медведев.
      Задача: Найти алгоритм отображения слова Путин через слово Медведев и алгоритм восстановления слова Путин из слова Медведев.
      Решение: Возьмем алфавит, состоящий из всех символов русского и английского языка, знаков препинания, пробела. Всего 190 символов, т.е. N = 190. Порядок символов в алфавите - случайный.
      Запишем собственный алфавит в следующем виде:
      17=П, 100=у, 34=т, 35=и, 144=н, 190=М, 88=е, 66=д, 1=в
      П=17, у=100, т=34, и=35, н=144, М=190, е=88, д=66, в=1
      В первой строке указаны адреса символов собственного алфавита в общем алфавите. Во второй строке указан собственный алфавит.
      Для преобразования буквы "П" в букву "М" сравним адреса букв "П" и "М". Это числа 17 и 190. Для отображения буквы "П" через букву "М" необходимо к числу 17 прибавить число 190-17=173 и по адресу 190 считать букву "М". Число 173 запишем в вектор на первое место, так как это число отображает первые буквы.
      Для отображения буквы "у" через букву "е" сравним адреса букв "у" и "е". Это числа 100 и 88. Для отображения буквы "у" через букву "е" необходимо к числу 100 прибавить неизвестное число x, такое чтобы получилось число 88. Решаем уравнение 100 + x = 88, отсюда x = -12. Наша задача получить все положительные числа для отображения. Поскольку, у нас получилось -12 < 1, то прибавим к нему количество чисел в алфавите -12 + 190 = 178. Таким образом, второе число отображающее букву "у" в букву "е" будет равно 178. Это число мы запишем на второе место в вектор 173, 178. Адрес буквы "е" вычисляется следующим образом: 100 + 178 - 190 = 88.
      Для отображения буквы "т" через букву "д" сравним адреса букв "т" и "д". Это числа 34 и 66. Для отображения буквы "т" через букву "д" необходимо к числу 34 прибавить неизвестное число x, такое чтобы получилось число 66. Решаем уравнение 34 + x = 66, отсюда x = 32. Таким образом, третье число отображающее букву "т" в букву "д" будет равно 32. Это число мы запишем на третье место в вектор 173, 178, 32. Адрес буквы "д" вычисляется следующим образом: 34+32= 66.
      Для отображения буквы "и" через букву "в" сравним адреса букв "и" и "в". Это числа 35 и 1. Для отображения буквы "и" через букву "в" необходимо к числу 35 прибавить неизвестное число x, такое чтобы получилось число 1. Решаем уравнение 35 + x = 1, отсюда x = -34. Наша задача получить все положительные числа для отображения. Поскольку, у нас получилось -34 < 1, то прибавим к нему количество чисел в алфавите -34 + 190 = 156. Таким образом, четвертое число отображающее букву "и" в букву "в" будет равно 156. Это число мы запишем на четвертое место в вектор 173, 178, 32, 156. Адрес буквы "в" вычисляется следующим образом: 35 + 156 - 190 = 1.
      Для отображения буквы "н" через букву "е" сравним адреса букв "н" и "е". Это числа 144 и 88. Для отображения буквы "н" через букву "е" необходимо к числу 144 прибавить неизвестное число x, такое чтобы получилось число 88. Решаем уравнение 144 + x = 88, отсюда x = -56. Наша задача получить все положительные числа для отображения. Поскольку, у нас получилось -56 < 1, то прибавим к нему количество чисел в алфавите -56 + 190 = 134. Таким образом, пятое число отображающее букву "н" в букву "е" будет равно 134. Это число мы запишем на пятое место в вектор 173, 178, 32, 156, 134. Адрес буквы "е" вычисляется следующим образом: 144 + 134 - 190 = 88.
      Предположим, что нам известно слово Медведев, алфавит и вектор чисел 173, 178, 32, 156, 134. Посмотрим, что получится при восстановлении.
      Находим адрес буквы "М" (первой буквы в слове Медведев) в алфавите. Это число 190. Поскольку при отображении мы прибавляли неизвестное число, то при восстановлении необходимо вычитать числа вектора. Вычтем из числа 190 первое число вектора 190 - 173 = 17. Поскольку число положительное, то по адресу 17 в алфавите находим букву "П". Первая буква восстановлена.
      Находим адрес буквы "е" (второй буквы в слове Медведев) в алфавите. Это число 88. Поскольку при отображении мы прибавляли неизвестное число, то при восстановлении необходимо вычитать числа вектора. Вычтем из числа 88 второе число вектора 88 - 178 = -90. Поскольку число меньше 1, то необходимо прибавить число N=190. Получим -90 + 190 = 100. По адресу 100 в алфавите находим букву "у". Вторая буква восстановлена. Всего восстановлено "Пу".
      Находим адрес буквы "д" (третьей буквы в слове Медведев) в алфавите. Это число 66. Поскольку при отображении мы прибавляли неизвестное число, то при восстановлении необходимо вычитать числа вектора. Вычтем из числа 66 третье число вектора 66 - 32 = 34. По адресу 34 в алфавите находим букву "т". Третья буква восстановлена. Всего восстановлено "Пут".
      Находим адрес буквы "в" (четвертой буквы в слове Медведев) в алфавите. Это число 1. Поскольку при отображении мы прибавляли неизвестное число, то при восстановлении необходимо вычитать числа вектора. Вычтем из числа 1 четвертое число вектора 1 - 156 = -155. Поскольку число меньше 1, то необходимо прибавить число N=190. Получим -155 + 190 = 35. По адресу 35 в алфавите находим букву "и". Четвертая буква восстановлена. Всего восстановлено "Пути".
      Находим адрес буквы "е" (пятой буквы в слове Медведев) в алфавите. Это число 88. Поскольку при отображении мы прибавляли неизвестное число, то при восстановлении необходимо вычитать числа вектора. Вычтем из числа 88 пятое число вектора 88 - 134 = -46. Поскольку число меньше 1, то необходимо прибавить число N=190. Получим -46 + 190 = 144. По адресу 144 в алфавите находим букву "н". Пятая буква восстановлена. Всего восстановлено "Путин".
      Числа в векторе использованы все, следовательно восстановление завершено. Количество чисел в векторе равно длине восстанавливаемой информации.
      Если бы первое слово было больше второго, то при достижении конца слова при отображении, необходимо перейти к первому символу. Таким образом, осуществляется отображение через один единственный символ.
      САМОЕ ВАЖНОЕ: адреса в алфавите должны начинаться с 1.
      Поскольку на элементы алфавита никаких ограничений не накладывается, то в качестве элементов алфавита могут выступать байты, произвольные тексты, слова и т.п.
      Можно использовать не один алфавит, а два и более.
      Необходимым и достаточным условием для отображения произвольного текста через другой произвольный текст: Алфавит должен содержать собственный алфавит. Поскольку числа вектора зависят только от порядка следования символов в алфавите и не зависят от самих символов, то существует целый класс, равный факториалу от N, отображения одной и той же информации через другую одну и ту же информацию.
      Этот алгоритм опубликован в 2009 г.
        Э-э-э... новый?
        Одни с годами умнеют, другие становятся старше.
          Это вообще тут за каким хреном появилось?
          Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
          Есть претензии ко мне как к участнику? да ради бога.
          Не нравятся мои ответы? не читайте их.
          В общем, берегите себя. Нервные клетки не восстанавливаются.
            Qraizer
            Это не новый, это спам. Который с 2009 ходит ползает по интернету.

            Скрытый текст

            1) Меня в админы этого форума.
            2) А автора я и сам забаню.
            Правильный обед должен состоять из 5 блюд приготовленных из 33 ингредиентов.
              Pavia
              Спам должен преследовать какие-то цели. Тут я ничего подобного не вижу. Сплошная глупость, основа которой - элементарная безграмотность и неспособность видеть дальше собственного носа. Придумать что-то, потом придумать, нафига оно, и тем гордиться. А что оно на самом деле не подходит - это уже мелочи, на которые можно не обращать внимания.
              Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
              Есть претензии ко мне как к участнику? да ради бога.
              Не нравятся мои ответы? не читайте их.
              В общем, берегите себя. Нервные клетки не восстанавливаются.
                Почему глупость. Простой алгоритм шифрования, основанный на табличной замене словарных примитивов. Только стар, как сам мир.
                Одни с годами умнеют, другие становятся старше.
                  Qraizer
                  Я о реализации. Глупо полагать, что у таблицы соответствия ака словарь нет твёрдой копии. Она есть, потому как в оперативе она откуда-то взялась. И после перезагрузки, особенно нештатной, должна будет опять откуда-то взяться. А коли так - то не вижу, почему она не может быть утянута вместе с "пошифрованными" данными. Да и снятие дампа памяти - вместе со словарём - тоже никто не отменял.

                  Аппаратное шифрование с аппаратным же ограничением на порционный и трафиковый объём куда как серьёзнее.
                  Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                  Есть претензии ко мне как к участнику? да ради бога.
                  Не нравятся мои ответы? не читайте их.
                  В общем, берегите себя. Нервные клетки не восстанавливаются.
                    'Исходный код шифрования универсальным алгоритмом текста.
                    'Код рабочий. Длина строки практически не ограничена.

                    Private Sub zasS_S_Rand(ByRef textIsxod As String, ByRef textRez As String, ByRef ChifrVxod As Short, ByRef RotorVxod As Short, ByRef NomerVxod1 As Integer, ByRef NomerVxod2 As Integer, ByRef BazisVxod As String, ByRef OblikVxod As String, ByRef ChaosVxod() As UShort, Optional ByRef LocalBB As Short = 1)
                    Dim J0 As Integer, J1 As Integer, Ich0 As Integer, Ich1 As Integer, Ich2 As Integer, DlinaIsxod As Integer
                    Dim L0 As String, DlinaBazis As UShort, DlinaChaos As Integer, DlinaNomer As Integer, DlinaProgres As Short
                    Dim AdresBazis As Integer, AdresOblik As Integer, AdresChaos As Integer, Ichet As Integer, Ipro As Short
                    Dim Simvol As Char, Lbuilder As New System.Text.StringBuilder("")
                    Dim Progres1 As Integer
                    'Процедура на языке Visual Basic 9.0 (Visual Basic 2008) Все параметры передаются по ссылке, так как тексты в виде строк могут быть очень большими.
                    'Типы данных:
                    'Byte = От 0 до 255 (беззнаковый). Один байт
                    'Short = От –32 768 до 32 767 (знаковый). Два байта.
                    'Integer = От –2 147 483 648 до 2 147 483 647 (знаковый). 4 байта.
                    'Long = От –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 (9,2... E+18 †) (знаковый). 8 байтов.
                    'String = От 0 до приблизительно 2 миллиардов знаков в кодировке Юникод.
                    'USort = От 0 до 65 535 (беззнаковый). Два байта.
                    'Char = От 0 до 65535 (беззнаковый). Два байта.
                    'System.Text.StringBuilder("") - инструмент VB9 для работы со строками переменной длины. Обычные инструменты работы со строками при любом изменении строки создают новую строку. При больших строках это очень сильно замедляет вычисления. Новый инструмент чрезвычайно быстро производит операции со строками.

                    'Шифрование текста в виде строки. Алфавит символьный - строка символов BazisVxod с адресами от 1 до 65535, второй алфавит строка символов OblokVxod с адресами от 1 до 65535, вектор чисел - ChaosVxod() с адресами от 0 до 65535
                    'Вход: textIsxod - исходный текст в виде строки символов, который нужно зашифровать или расшифровать с адресами от 1 до DlinaIsxod
                    ' textRez - результат шифрования строки символов textIsxod с адресами от 1 до DlinaIsxod
                    ' NomerVxod1 - номер первого символа в тексте textIsxod, подлежащий шифрованию, отсчет с 1
                    ' NomerVxod2 - номер последнего символа в тексте textIsxod, подлежащий шифрованию, отсчет с 1
                    ' LocalBB - учет относительного влияния порядка отсчета чисел вектора. Результаты шифрования различны при различных значения параметра.
                    ' = 0 - отсчет ведется с начала textRez
                    ' = 1 - отсчет ведется от NomerVxod1 до NomerVxod2
                    ' = 2 - отсчет ведется по BazisVxod от 1 до DlinaBazis+1
                    'Параметры шифрования:
                    ' ChifrVxod = 0 - расшифровать textIsxod, 1 - зашифровать textIsxod, понятие расшифровать и зашифровать выбрано произвольно. Можно расшифровывать, а восстанавливать, зашифровывая.
                    ' RotorVxod = 0 - левое вращение, 1 - правое вращение. Результаты шифрования абсолютно различны, в лучшем случае совпадает один символ в середине.
                    ' BazisVxod - алфавит символьный в виде строки - перечень символов в textIsxod, подлежащих шифрованию, индекс с 1. Количество символов от 2 до 65535. Все символы должны быть различными. Символы, не входящие в BazisVxod, копируются из textIsxod в textRez без изменения. Длина BazisVxod равна DlinaBazis, изменяется от 2 до 65535.
                    ' OblikVxod - второй символьный алфавит, отличается от первого только порядком следования одних и тех же символов. Может быть равен первому.
                    ' ChaosVxod() - вектор чисел от 1 до длины BazisVxod. Количество чисел в векторе может быть от 1 до длины textIsxod по выбору пользователя. Числа в векторе - произвольные из области значений. Например, длина вектора = 3. Это означает, что в векторе 3 числа: 1)Первое от 1 до DlinaBazis. 2)Второе от 1 до DlinaBazis, может быть равно первому. Третье от 1 до DlinaBazis, может быть равное первому или второму.

                    'DlinaProgres = 100 'Параметр для индикатора отображения выполняемой операции
                    'ProgressBar1.Maximum = 100 'Параметр для индикатора отображения выполняемой операции
                    'Progres1 = 100000 'Параметр для индикатора отображения выполняемой операции
                    DlinaBazis = Len(BazisVxod) 'Длина первого алфавита, количество символов
                    DlinaChaos = UBound(ChaosVxod) + 1 'Длина вектора, количество чисел
                    Ich0 = NomerVxod1 - 1: Ich1 = 0: Ich2 = 0
                    DlinaIsxod = Len(textIsxod) 'Длина текста, подлежащего шифрованию
                    Lbuilder.Capacity = DlinaIsxod
                    'Копирование не шифруемой начальной части текста без изменения
                    For J0 = 1 to NomerVxod1 - 1
                    Simvol = Mid(textIsxod, J0, 1)
                    Lbuilder.Append(Simvol, 1)
                    Next

                    DlinaNomer = NomerVxod2 - NomerVxod1 + 1
                    Ichet = 0
                    Select Case ChifrVxod
                    Case 0 'Расшифровать
                    For J0 = NomerVxod1 To NomerVxod2
                    Ich0 = Ich0 + 1
                    Ich1 = Ich1 + 1
                    L0 = Mid(textIsxod, J0, 1)
                    AdresOblik = InStr(OblikVxod, L0)
                    Select Case RotorVxod
                    Case 0
                    Select Case AdresOblik
                    Case 0
                    'Если символ отсутствует в алфавите, то копируется в результат без изменения
                    If L0 <> Nothing Then Simvol = L0: Lbuilder.Append(Simvol, 1)
                    Case Else
                    Ich2 = Ich2 + 1
                    Select Case LocalBB
                    Case 0
                    J1 = Ich0 Mod DlinaChaos
                    Case 1
                    J1 = Ich1 Mod DlinaChaos
                    Case 2
                    J1 = Ich2 Mod DlinaChaos
                    Case Else
                    End Select
                    AdresChaos = ChaosVxod(J1)
                    AdresBazis = AdresOblik + AdresChaos
                    If AdresBazis > DlinaBazis Then AdresBazis = AdresBazis - DlinaBazis
                    Simvol = Mid(BazisVxod, AdresBazis, 1)
                    Lbuilder.Append(Simvol, 1)
                    End Select
                    Case Else
                    Select Case AdresOblik
                    Case 0
                    'Если символ отсутствует в алфавите, то копируется в результат без изменения
                    If L0 <> Nothing Then Simvol = L0: Lbuilder.Append(Simvol, 1)
                    Case Else
                    Ich2 = Ich2 + 1
                    Select Case LocalBB
                    Case 0
                    J1 = Ich0 Mod DlinaChaos
                    Case 1
                    J1 = Ich1 Mod DlinaChaos
                    Case 2
                    J1 = Ich2 Mod DlinaChaos
                    Case Else
                    End Select
                    AdresChaos = ChaosVxod(J1)
                    AdresBazis = AdresOblik - AdresChaos
                    If AdresBazis < 1 Then AdresBazis = AdresBazis + DlinaBazis
                    Simvol = Mid(BazisVxod, AdresBazis, 1)
                    Lbuilder.Append(Simvol, 1)
                    End Select
                    End Select
                    'Необязательная часть
                    'Ichet = Ichet + 1
                    'If Ichet = Progres1 Then
                    ' Ipro = Int(((J0 - NomerVxod1 + 1) / (DlinaNomer)) * DlinaProgres): Ichet = 0
                    ' ProgressBar1.Value = Ipro
                    ' ProgressBar1.Refresh
                    ' Form7.PausaSecond7
                    'End If
                    Next J0
                    'ProgressBar1.Value = 0
                    Case 1 'Зашифровать
                    For J0 = NomerVxod1 To NomerVxod2
                    Ich0 = Ich0 + 1
                    Ich1 = Ich1 + 1
                    L0 = Mid(textIsxod, J0, 1)
                    AdresBazis = InStr(BazisVxod, L0) 'Адрес символа в базисе
                    Select Case RotorVxod
                    Case 0
                    Select Case AdresBazis
                    Case 0
                    'Если символ отсутствует в алфавите, то копируется в результат без изменения
                    If L0 <> Nothing Then Simvol = L0: Lbuilder.Append(Simvol, 1)
                    Case Else
                    Ich2 = Ich2 + 1
                    Select Case LocalBB
                    Case 0
                    J1 = Ich0 Mod DlinaChaos
                    Case 1
                    J1 = Ich1 Mod DlinaChaos
                    Case 2
                    J1 = Ich2 Mod DlinaChaos
                    Case Else
                    End Select
                    AdresChaos = ChaosVxod(J1)
                    AdresOblik = AdresBazis - AdresChaos
                    If AdresOblik < 1 Then AdresOblik = AdresOblik + DlinaBazis
                    Simvol = Mid(OblikVxod, AdresOblik, 1)
                    Lbuilder.Append(Simvol, 1)

                    End Select
                    Case Else
                    Select Case AdresBazis
                    Case 0
                    'Если символ отсутствует в алфавите, то копируется в результат без изменения
                    If L0 <> Nothing Then Simvol = L0: Lbuilder.Append(Simvol, 1)
                    Case Else
                    Ich2 = Ich2 + 1
                    Select Case LocalBB
                    Case 0
                    J1 = Ich0 Mod DlinaChaos
                    Case 1
                    J1 = Ich1 Mod DlinaChaos
                    Case 2
                    J1 = Ich2 Mod DlinaChaos
                    Case Else
                    End Select
                    AdresChaos = ChaosVxod(J1)
                    AdresOblik = AdresBazis + AdresChaos
                    If AdresOblik > DlinaBazis Then AdresOblik = AdresOblik - DlinaBazis
                    Simvol = Mid(OblikVxod, AdresOblik, 1)
                    Lbuilder.Append(Simvol, 1)

                    End Select
                    End Select
                    'Необязательная часть
                    'Ichet = Ichet + 1
                    'If Ichet = Progres1 Then
                    ' Ipro = Int(((J0 - NomerVxod1 + 1) / (DlinaNomer)) * DlinaProgres): Ichet = 0
                    ' ProgressBar1.Value = Ipro
                    ' ProgressBar1.Refresh
                    ' Form7.PausaSecond7
                    'End If
                    Next J0
                    'ProgressBar1.Value = 0
                    Case Else
                    End Select
                    'Копирование не шифруемой конечной части текста без изменения
                    For J0 = NomerVxod2 + 1 to DlinaIsxod
                    Simvol = Mid(textIsxod, J0, 1)
                    Lbuilder.Append(Simvol, 1)
                    Next
                    textRez = Lbuilder.ToString
                    End Sub
                      Цитата VictorMih @
                      А украсть алфавит из оперативной памяти практически невозможно.

                      Не знаю как в Linux, а в Windows это делается даже штатными средствами (диспетчер задач умеет делать дамп памяти процесса). Я уж не говорю про нашумевшую уязвимость Heartbleed.
                        В linux достаточно просто прочитать соответствующий файл в виртудальном каталоге /proc/pid.
                        Подпись была включена в связи с окончанием срока наказания
                          Цитата
                          Почему глупость. Простой алгоритм шифрования, основанный на табличной замене словарных примитивов. Только стар, как сам мир.

                          Это называется кодированием. Впервые такое способ кодирования описали Стругацкие А. и Б. в своей повести "Сказка о Тройке". Вот достоверный контрольный пример:
                          Цитата
                          Кодируем помаленьку.
                          - Что это еще за лпч?
                          - Лампочка, значит, - сказал старичок хихикая и потирая руки.
                          Сообщение отредактировано: Tishaishii -
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script Execution time: 0,1119 ]   [ 14 queries used ]   [ Generated: 20.06.19, 13:19 GMT ]