Вам не всегда нужна база данных.
Если вам нужно хранить менее нескольких тысяч «вещей» и вам не нужна блокировка, плоские файлы могут работать и лучше во многих отношениях. Они более портативны, и вы можете отредактировать их вручную в крайнем случае. Если у вас есть правильное разделение между вашими данными и бизнес-логикой, вы можете легко заменить плоские файлы базой данных, если это понадобится вашему приложению. И если вы разрабатываете это с учетом этого, это напоминает вам о надлежащем разделении между вашими данными и бизнес-логикой.
-
Bmb
На самом деле оба mcrypt_encrypt ()
и mcrypt_decrypt ()
, а также другие функции шифрования / дешифрования (например, mcrypt_generic ()
или mdecrypt_generic ()
) do дополните параметр $ data
длиной n * <
. Символ заполнения - это символ NUL
( \ x0
или \ 0
), тогда как <
зависит от шифра и используемые режимы блочного шифрования. Вам следует взглянуть на режимы работы блочного шифра и Padding (криптография) .
Ниже приводится результат mcrypt_get_block_size ()
для каждого из доступные шифры и режимы на моей машине. Очевидно, функция не принимает во внимание, что такие режимы, как CFB, OFB и CTR не требуют каких-либо специальных мер для обработки сообщений, длина которых не кратна размеру блока, поскольку все они работают путем XOR-операции открытого текста с выходными данными. блочного шифра (цитата из Википедии). CBC, который используется в вашем примере, всегда требует, чтобы последний блок был дополнен перед шифрованием.
cast-128
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
gost
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
rijndael-128
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
twofish
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
arcfour
cbc: not supported
cfb: not supported
ctr: not supported
ecb: not supported
ncfb: not supported
nofb: not supported
ofb: not supported
stream: 1 bytes
cast-256
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
loki97
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
rijndael-192
cbc: 24 bytes
cfb: 24 bytes
ctr: 24 bytes
ecb: 24 bytes
ncfb: 24 bytes
nofb: 24 bytes
ofb: 24 bytes
stream: not supported
saferplus
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
wake
cbc: not supported
cfb: not supported
ctr: not supported
ecb: not supported
ncfb: not supported
nofb: not supported
ofb: not supported
stream: 1 bytes
blowfish-compat
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
des
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
rijndael-256
cbc: 32 bytes
cfb: 32 bytes
ctr: 32 bytes
ecb: 32 bytes
ncfb: 32 bytes
nofb: 32 bytes
ofb: 32 bytes
stream: not supported
serpent
cbc: 16 bytes
cfb: 16 bytes
ctr: 16 bytes
ecb: 16 bytes
ncfb: 16 bytes
nofb: 16 bytes
ofb: 16 bytes
stream: not supported
xtea
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
blowfish
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
enigma
cbc: not supported
cfb: not supported
ctr: not supported
ecb: not supported
ncfb: not supported
nofb: not supported
ofb: not supported
stream: 1 bytes
rc2
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
tripledes
cbc: 8 bytes
cfb: 8 bytes
ctr: 8 bytes
ecb: 8 bytes
ncfb: 8 bytes
nofb: 8 bytes
ofb: 8 bytes
stream: not supported
Следовательно, вы должны rtrim ()
вывод функций дешифрования, чтобы получить исходную строку, если ваш шифр работает с блоками фиксированной длины:
$output = rtrim($decrypted, "\0");
В моей реализации TripleDES я обнаружил, что расшифрованная строка была дополнена символами \ 5 или \ 6. Это не ожидаемые символы \ 0 или \ 4, упомянутые выше или в примерах PHP.net. Чтобы определить значение ASCII символа заполнения, используйте функцию ord () . ord () работает с одним символом, поэтому используйте str_split (), чтобы разбить строку или получить прямой доступ к символу с помощью записи массива - $ string [5].
Окончательный результат обрезки - trim ($ decrypt, "\ 0 .. \ 32");
Окончательный результат кода -
$key = "encryption key";
$encrypt = base64_decode($encrypt);
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypt = mcrypt_decrypt(MCRYPT_3DES, $key, $encrypt, MCRYPT_MODE_ECB, $iv);
$final = trim($decrypt, "\0..\32"); // removes potential null padding