Обфускация идентификаторов таблицы MySQL с использованием решения только для MySQL и генерация уникальных значений - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужно скрыть идентификаторы таблицы MySQL, используя решение только для MySQL (без кода приложения, такого как PHP), и генерировать уникальные значения.

Вот что мне удалось получить (используя триггер MySQL дляобновить строку, которая была вставлена, со значением comment_hash. Проблема в том, что я получаю ошибку «Duplicate Entry». Я знаю, что хэши не уникальны, но как я могу сопоставить значение UNIQUE _comments.id с уникальным 4-символьным хешем?)

DROP TABLE IF EXISTS _comments;
CREATE TABLE IF NOT EXISTS _comments (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `comment_hash` VARCHAR(255) NOT NULL,
    `user_id` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `comment_user_hash_parentid_unique` (`user_id`,`comment_hash`)
)  ENGINE=INNODB;


DROP TRIGGER IF EXISTS `test_add_comment_hash_on_insert_into_comments_table`;
DELIMITER //
CREATE TRIGGER test_add_comment_hash_on_insert_into_comments_table
BEFORE INSERT ON _comments
FOR EACH ROW
BEGIN
    SET NEW.comment_hash = right(md5(LAST_INSERT_ID()+1),4);
END
//
DELIMITER ;

А потом в моей сеялке (я использую Laravel для удобства множественных вставок в PHP для цикла), но вы можете использовать все что угодно для быстрой вставки.


<?php

use Illuminate\Database\Seeder;

use Faker\Generator as Faker;

// Call using command: php artisan db:seed --class=CommentsFakeDataSeeder
class WtfFakeDataSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run(Faker $faker)
    {
        echo "Seeding _comments... \n";

        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $fake_comments = [];

        for ($i = 0; $i < 10000; $i++) {
            $fake_comments[] = [
                'user_id'   => 1,
            ];
        }
        DB::table('_comments')->insert($fake_comments);

        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
}

Iвызовите сеялку с: php artisan db:seed --class=WtfFakeDataSeeder

Но я всегда получаю нарушение ограничения целостности

Doctrine\DBAL\Driver\PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-849b' for key 'comment_user_hash_parentid_unique'")

Если в 4-значном comment_hash разрешены только строчные и буквенно-цифровые символы, мы должны иметь36 ^ 4 = 1679616 значений.Тем не менее, столкновения происходят со вставками <10K, как вы можете видеть ниже.MD5 () не является правильным решением здесь .. вы знаете, что это?идентификаторы всегда уникальны ... объединяю ли я их с идентификатором пользователя (для большей энтропии), как я могу сопоставить их с уникальными 4-символьными значениями хеша? </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...