MySQL Encryption

0

Я пытаюсь зашифровать некоторые поля в MySQL. Я использую версию TPC-DS версии v2.8 и я пытаюсь использовать AES в некоторых столбцах таблицы адресов клиентов. Любая идея, как вы можете зашифровать все строки полей? Я попытался использовать

UPDATE customer SET c_first_name = AES_ENCRYPT(c_first_name, key)

но я получаю сообщение о том, что Data too long for column c_first_name at row 1

  • 0
    Какой тип имеет c_first_name ?
  • 0
    @ LasseVågsætherKarlsen имя клиента. Должен ли я изменить число символов char (от varchar (12) до varchar (200) для примера)?
Показать ещё 2 комментария
Теги:
encryption

2 ответа

2

В документации рекомендуется хранить зашифрованные значения в столбцах типа VARBINARY и BLOB, а также для расчета необходимого размера столбца при использовании AES_ENCRYPT().

16 * (trunc (string_length/16) + 1)

"string_length" - это байты, необходимые для хранения строки, а не количество символов, которое зависит от используемого вами параметра CHARACTER SET. Вы получите эту информацию как character_octet_length в information_schema. columns

Если вы используете utf8mb4 в качестве набора символов, ваш столбец VARCHAR (12) c_first_name будет иметь character_octet_length 48, и вам потребуется VARBINARY (64) для размещения любого возможного значения.

mysql> SELECT 16 * (TRUNCATE(48 / 16, 0) + 1);
+---------------------------------+
| 16 * (TRUNCATE(48 / 16, 0) + 1) |
+---------------------------------+
|                              64 |
+---------------------------------+

например

mysql> SELECT LENGTH(AES_ENCRYPT(_utf8mb4'','salt')) AS v arbinary_length;
+------------------+
| varbinary_length |
+------------------+
|               64 |
+------------------+

Вы можете использовать это, чтобы получить требуемые размеры столбцов VARBINARY для таблицы клиентов

SELECT 'column_name', 'character_set_name', 'column_type', 'character_octet_length',
16 * (TRUNCATE('character_octet_length' / 16, 0) + 1) AS varbinary_size
FROM 'information_schema'.'columns'
WHERE 'table_name' = 'customer'; 
0

вы можете попробовать ниже

alter table customer modify c_first_name varbinary(200);
update customer 
set c_first_name = aes_encrypt(c_first_name , 'secretyKey');
  • 0
    Да, это то, что я думал. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню