Skip to content
导航栏

本文目的为了说明 aes 加解密在 yao 中是如何实现的。

model 文件如下

我们只看 mobile 列,很明显 crypt 的属性是"AES",代表该字段进行 AES 加解密。(注:在 yao 中这些过程是自动的,根据源码得知只有在 mysql 中才能生效)

json
{
  "name": "用户",
  "table": {
    "name": "xiang_user",
    "comment": "用户表",
    "engine": "InnoDB"
  },
  "columns": [
    { "label": "ID", "name": "id", "type": "ID" },
    {
      "label": "手机号",
      "name": "mobile",
      "type": "string",
      "length": 50,
      "comment": "手机号",
      "index": true,
      "nullable": true,
      "crypt": "AES",
      "validations": [
        {
          "method": "mobile",
          "args": [],
          "message": "{{input}}格式错误"
        }
      ]
    },
    {
      "label": "姓名",
      "name": "name",
      "type": "string",
      "length": 80,
      "comment": "姓名",
      "index": true,
      "nullable": true,
      "validations": [
        {
          "method": "typeof",
          "args": ["string"],
          "message": "{{input}}类型错误, {{label}}应该为字符串"
        },
        {
          "method": "minLength",
          "args": [2],
          "message": "{{label}}至少需要2个字"
        },
        {
          "method": "maxLength",
          "args": [40],
          "message": "{{label}}不能超过20个字"
        }
      ]
    },
    {
      "label": "状态",
      "comment": "用户状态 enabled 有效, disabled 无效",
      "name": "status",
      "type": "enum",
      "default": "enabled",
      "option": ["enabled", "disabled"],
      "index": true,
      "validations": [
        {
          "method": "typeof",
          "args": ["string"],
          "message": "{{input}}类型错误, {{label}}应该为字符串"
        },
        {
          "method": "enum",
          "args": ["enabled", "disabled"],
          "message": "{{input}}不在许可范围, {{label}}应该为 enabled/disabled"
        }
      ]
    }
  ],
  "relations": {},
  "values": [
    {
      "name": "用户",
      "mobile": "13900001111",
      "status": "enabled"
    }
  ],
  "indexes": [
    {
      "comment": "类型手机号唯一",
      "name": "type_mobile_unique",
      "columns": ["type", "mobile"],
      "type": "unique"
    }
  ],
  "option": { "timestamps": true, "soft_deletes": true }
}

实现方法

在新增和修改数据时,会调用 mysql 的内置函数 AES_ENCRYPT。

在读取数据时,会调用 mysql 的内置函数 AES_DECRYPT。

AES_ENCRYPT 和 AES_DECRYPT 是 MySQL 中的两个函数,用于加密和解密数据。它们使用 AES 算法(Advanced Encryption Standard)对数据进行加密和解密。 这些函数需要一个密钥来进行加密和解密。以下是使用 AES_ENCRYPT 和 AES_DECRYPT 的示例:

sql
-- 加密
SELECT AES_ENCRYPT('mytext', 'mykey');

-- 解密
SELECT AES_DECRYPT('encryptedtext', 'mykey');

在上面的示例中,'mytext'是要加密的文本,'encryptedtext'是要解密的加密文本,'mykey'是用于加密和解密的密钥。

在 yao 中,密钥默认是空字符串,通过 YAO_DB_AESKEY 环境变量可以进行设置。

此外,在 yao 中,保存到数据库中的字段会使用 HEX 函数进行转码,所以在数据表中看到的数据,并不是真正的密文,使用 UNHEX 函数转码后才是真正的密文。