了解 MYSQL 中的 DECODE 和 ENCODE

Uderstanding DECODE and ENCODE in MYSQL

我需要以加密的方式保存 id,以便它正好占用 8 个字符。 我使用以下命令做到了这一点:

SELECT encode(LPAD(id,4,0),'abc')

此命令将 id = 1 变成 0001 然后把它变成代码 fe5ab21a

如何解密此代码?

下面是一个 select 的示例及其生成的结果

SELECT 0001
, DECODE(ENCODE('0001', 'abc'), 'abc')
, UNHEX(DECODE(ENCODE('0001', 'abc'), 'abc'))
, ENCODE('0001','abc')
, DECODE('fe5ab21a', 'abc')
, UNHEX(DECODE('fe5ab21a', 'abc'))
, HEX('0001')

结果:

1
30303031
0001
fe5ab21a
68d357a7005dcbe0
NULL
30303031

据我所知,您想制作一个与您的 ID 相关联的简短唯一密钥传递。

小心这种加密方式,如果有人想破解它,不到几分钟的时间,它真的很弱。但是如果只是为了某些人没有安全风险的混淆,没问题。

为了提高一点安全性(但会降低用户体验),尝试使用AES_ENCRYPT()

您的代码的错误在于您没有强制使用 input/output 的类型,这里是正确输入的内容。

SQL Fiddle

MySQL 5.6 架构设置:

CREATE TABLE t
    (`id` int, `name` varchar(7))
;

INSERT INTO t
    (`id`, `name`)
VALUES
    (1, 'hello'),
    (2, 'hola'),
    (3, 'bonjour')
;

查询 1:

select *, ENCODE(id,'KEY') as encrypted_id from t

Results:

| id |    name | encrypted_id |
|----|---------|--------------|
|  1 |   hello |         Vw== |
|  2 |    hola |         yw== |
|  3 | bonjour |         iA== |

查询 2:

SELECT * from t where id = CAST(DECODE(FROM_BASE64('yw=='),'KEY') AS CHAR(50))

Results:

| id | name |
|----|------|
|  2 | hola |