Я на самом деле приятно удивлен, кто-то спросил, прежде чем сделать это неправильно.
Однако, то, что вы спрашиваете, довольно широко для одного ответа. Я бы посоветовал пройти хотя бы какой-нибудь базовый курс по криптографии (я бы порекомендовал Coursera . Даже если вы не закончите свой курс, вы получите довольно хорошие основы, что и почему вы должны или не должны делать) не делать.
простое приложение для входа в систему, где мне нужно хранить значения в БД
blockquote>Если значения вы имеете в виду пароли пользователей, то используйте хеш с медленным засолением, пожалуйста, прочтите [ 112] https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
Если вы хотите зашифровать некоторые значения обратимы, существует множество примеров, хотя не все они безопасны,
Код будет очень полезным
blockquote>, вы можете проверить https: // gusto77.wordpress.com/2017/10/30/encryption-reference-project/
что такое алгоритм, ключ, отступы и почему мы должны использовать getBytes ().
blockquote>Я начну с байтов. Шифрование работает с байтовыми массивами. Так что для любого xt вам нужно конвертировать ваши данные, ключи, пароли, .. в байтовые массивы. Также зашифрованные данные являются байтовыми массивами.
Для алгоритма, заполнения, .. Я действительно советую вам узнать об этом немного больше самостоятельно.
Существуют шифры (алгоритмы), которые сегодня считаются безопасными, более важно, чтобы вы использовали их правильно.
Просто для примера, обычно используется
AES/CBC/PKCS5Padding
- AES - шифр (алгоритм шифрования)
- CBC - режим работы
- PKCS5Padding - заполнение для подгонки данных к требуемой длине блока
.Можно ввести предопределенное фиксированное слово или мы можем установить наш собственный ключ. [ 1121] blockquote>
Ключ - это ваше секретное значение, вам нужен тот же ключ для расшифровки зашифрованных данных, но ключ ваш, лучше всего, если он случайный
GetMem всегда выделяет память, FreeMem всегда выпускает/освобождает память, ReallocMem может сделать один, другой или оба. На самом деле, при надлежащем использовании ReAllocMem является действительно единственным управлением памятью необходимый API. Если Вы запускаете с нулевого указателя и называете ReAllocMem с размером> 0, то он действует как GetMem. Если Вы называете ReAllocMem с размером = 0, то он действует как FreeMem. Единственное время это на самом деле "перераспределяет" память, - то, если указатель является ненолем и размером> 0.
Новый и Располагают, разработаны для работы с введенными указателями или для Вас "старые-skool" люди, более старая объектная модель Turbo Pascal (старый "объект) синтаксис. Новый и Располагают, также гарантирует, что любой введенный указатель, который является ссылкой на управляемый тип, правильно инициализирует тот тип. Например, учитывая следующее:
type
PMyRec = ^TMyRec;
TMyRec = record
Name: string;
Value: Variant;
end;
var
Rec: PMyRec;
begin
New(Rec);
try
Rec.Name := 'TestValue';
Rec.Value := 100;
...
finally
Dispose(Rec);
end;
end;
Новый и Располагают, гарантирует, что поля Name и Value записи правильно инициализированы и завершены или очищены. Новый и Располагают, в вышеупомянутом случае эквивалентно:
GetMem(Rec, SizeOf(Rec^));
Initialize(Rec);
...
Finalize(Rec);
FreeMem(Rec);
Для примера Вы дали, Gamecat является правильным, Вы, вероятно, были бы более обеспеченным использованием динамического массива, так как ими лучше управляет компилятор, и они также несут свою собственную внутреннюю длину. С Вашим примером необходимо было бы отдельно отслеживать количество объектов в массиве, таком, что везде, куда Вы раздали массив, необходимо будет также раздать, в настоящее время выделяют длину. При помощи динамического массива вся информация сохранена аккуратно упакованной вместе. Это позволило бы Вам выполнять итерации по массиву независимо от текущей длины путем простого выполнения одного из следующих действий:
var
Member: TMemberData;
Items: array of TMemberData;
...
begin
SetLength(Items, Value);
for Member in Items do // iterate over each element in the array
...
for Low(Items) to High(Items) do // same as above only using std functions
...
end;
Наконец, другая причина, Вы, вероятно, хотели бы использовать динамический массив, состоит в том, что, если TMemberData содержал строки, варианты, интерфейсы или другие "управляемые" типы, они будут правильно инициализированы и завершены без потребности сделать это вручную.
GetMem выделяет блок памяти. ReallocMem перераспределяет блок памяти.
Но Вы лучше используете динамические массивы:
var
FItems : array of TMemberDataList;
begin
SetLength(FItems, Value);
end;
Больше Delphi путь.
Пример
Вы могли или сделать:
type
TMemberDataList = array[0..MaxClassMembers -1] of TMemberData;
var
FItems: TMemberDataList;
begin
// Don't need to allocate FItems
end;
Или:
type
TMemberDataList = array of TMemberData;
var
FItems: TMemberDataList;
begin
SetLength(FItems, MaxClassMembers);
end;
Переменные класса являются указателями. Таким образом, Вы не должны использовать явные указатели как, мы имели отношение к TP. Все еще можно использовать указатели на записи или объекты, но нет никакой причины сделать это.