【问题标题】:Uderstanding DECODE and ENCODE in MYSQL了解 MYSQL 中的 DECODE 和 ENCODE
【发布时间】:2016-03-02 16:41:58
【问题描述】:

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

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

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

如何解密此代码?

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

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”听起来对我来说真的很糟糕......
  • 我需要为一组用户生成短字符代码(他们必须手动输入)以供一次性使用,但我无法修改数据库的结构。表中唯一的唯一字段是 id。

标签: mysql decode encode


【解决方案1】:

据我了解,您希望制作一个与您的 ID 相关联的简短的唯一密钥通行证。

小心这种加密,如果有人想破解它,不到几分钟,它真的很弱。但如果只是为了一些没有安全风险的混淆,没关系。

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

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

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 |

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2013-10-29
    • 2011-06-28
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2010-09-23
    • 2016-02-24
    相关资源
    最近更新 更多