要获得独特且随机的令牌,您可以加密您的主密钥,即:
SELECT HEX(AES_ENCRYPT(your_pk,'your_password')) AS 'token' FROM your_table;
这已经足够好了,而且它是可逆的,因此您不必将该令牌存储在您的表中,而是生成它。
另一个优势是,一旦您从该令牌解码您的 PK,您就不必对您的表进行繁重的全文搜索,而只需简单快速的 PK 搜索。
不过有一个小问题。 MySql 支持不同的block encryption modes,如果更改将完全改变您的令牌空间,使旧令牌无用......
为了克服这个问题,可以在生成令牌之前设置该变量,即:
SET block_encryption_mode = 'aes-256-cbc';
不过有点浪费...解决方案是在令牌上附加一个加密模式使用标记:
SELECT CONCAT(CONV(CRC32(@@GLOBAL.block_encryption_mode),10,35),'Z',HEX(AES_ENCRYPT(your_pk,'your_password'))) AS 'token' FROM your_table;
如果您希望将该令牌保留在INSERT 上的表中,则可能会出现另一个问题,因为要生成它,您需要知道尚未插入的记录的primary_key...当然您可能只需要INSERT 和然后 UPDATE 和 LAST_INSERT_ID() 但同样 - 还有一个更好的解决方案:
INSERT INTO your_table ( token )
SELECT CONCAT(CONV(CRC32(@@GLOBAL.block_encryption_mode),10,35),'Z',HEX(AES_ENCRYPT(your_pk,'your_password'))) AS 'token'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = "your_table";
此解决方案的最后一个但并非最不重要的优势是您可以轻松地将其复制为 php、python、js 或您可能使用的任何其他语言。