Skip to main content

Secret

secret输入是一种用于向操作后端传递secret和敏感信息的输入类型,通过secret输入发送的值会使用您的私人密钥进行额外的加密。 此外,通过secret输入发送的值不会被 Port 记录或保存。

💡 常用secret Usage

secret输入类型可被用于于敏感信息,如: "......":

  • 云secret;
  • 密码
  • API 密钥
  • Secret 令牌
  • 等等。

secret输入结构

secret输入的定义与普通输入相同,但多了一个指定加密算法的 "加密 "字段:

{
"mySecretInput": {
"title": "My secret input",
"icon": "My icon",
"type": "string",
"encryption": "aes256-gcm",
"description": "My entity input"
}
}
  • aes256-gcm - 这将在GCM mode 中使用 256 位 AES 对属性数据进行加密。加密值前缀为 16 位 IV,后缀为 16 位 MAC,编码为基序 64。加密密钥将是贵组织Client Secret 的前 32 个字节。

支持的类型

{
"mySecretInput": {
"title": "My secret input",
"icon": "My icon",
"type": "string",
"encryption": "aes256-gcm",
"description": "My entity input"
}
}

**注意: ** 不支持为 secrets 输入设置 format 格式。

处理有效载荷

发送到基础架构的有效载荷将包含secret属性输入的加密值。 要使用secret输入,您需要对其进行解密:

示例

解密使用 "aes256-gcm "算法加密的属性的示例。

下面的示例被用于了 flaskpycryptodome 软件包:

import base64
import json
import os

from flask import Flask, request
from Crypto.Cipher import AES

PORT_CLIENT_SECRET = 'YOUR PORT CLIENT SECRET'
PROPERY_IS_JSON = False # whether the property is defined as json or not (string otherwise)

app = Flask(__name__)

@app.route('/', methods=['POST'])
def webhook():
# initialize the aes cipher
key = PORT_CLIENT_SECRET[:32].encode()

req = request.get_json(silent=True, force=True)
encrypted_property_value = base64.b64decode(req.get('payload').get('properties').get('secret-property'))

iv = encrypted_property_value[:16]
ciphertext = encrypted_property_value[16:-16]
mac = encrypted_property_value[-16:]

cipher = AES.new(key, AES.MODE_GCM, iv)

# decrypt the property
decrypted_property_value = cipher.decrypt_and_verify(ciphertext, mac)
property_value = json.loads(decrypted_property_value) if PROPERY_IS_JSON else decrypted_property_value

return property_value # this is the original value the user sent

if __name__ == '__main__':
port = int(os.getenv('PORT', 80))

print("Starting app on port %d" % port)

app.run(debug=False, port=port, host='0.0.0.0')