使用对称密钥算法加密签名数据。验证签名数据并识别可能的验证错误。使用sha-(1, 224, 256, 385和512)/hmac进行签名加密。允许自定义哈希算法。提供用于签名(和验证)字典和URL的有用快捷函数。

0.1.8 2021-11-19 01:31 UTC

This package is not auto-updated.

Last update: 2024-09-20 14:24:01 UTC


README

允许您轻松地使用对称密钥算法加密签名数据。允许您验证签名数据并识别可能的验证错误。使用sha/hmac进行签名加密。包含用于签名(和验证)字典的快捷函数。

Packagist version Supported PHP versions Build Status License

关键概念

相互通信的主机共享密钥,该密钥用于签名数据(请求)。密钥永远不会被发送。

其中一种情况是HTTP请求的签名。每个(HTTP)请求在发送方使用共享密钥签名,并生成三联体(signatureauth_uservalid_until),这些联体用于签名请求。

  • signature (string):生成的签名。
  • auth_user (string):发起请求的用户。可以是任何内容。
  • valid_until (floatstring):签名的过期时间(Unix时间戳)。

在接收方,使用共享密钥验证(HTTP请求)数据。检查签名是否有效且未过期。

    ┌─────────────┐           Data              ┌─────────────┐
    │   Host 1    ├────────────────────────────>│   Host 2    │
    │ ─────────── │                             │ ─────────── │
    │ secret key  │                             │ secret key  │
    │ 'my-secret' │<────────────────────────────┤ 'my-secret' │
    └─────────────┘           Data              └─────────────┘

特性

  • 签名字典。
  • 验证签名字典。

先决条件

  • composer
  • php-json
  • php-mbstring

生态系统

需要其他语言的ska?请查看以下关联项目

  • ska:Python中的ska实现。这是当前项目的第一个实现。
  • skajs:NodeJS中的ska实现(支持CommonJS和ESM,Node >= 14)。

生成的签名在Python、NodeJS和PHP实现之间是互操作的。

安装

从composer注册表获取最新稳定版本

composer require barseghyanartur/ska

用法示例

存在用法示例。

php examples/kitchen_sink.php

基本用法

发送方

签名字典就像这样简单。

必需的导入。
require_once(dirname(__FILE__)."/src/SKA/core.php");
use SKA;
签名数据

示例使用

$signedData = SKA\signatureToDict("user", "your-secret_key");
print_r($signedData);

示例输出

Array
(
    [signature] => WEwnd40jMusHD6hRZ9WOCR8Zym4=
    [auth_user] => user
    [valid_until] => 1631795130.0
    [extra] => 
)

将附加数据添加到签名的方式相同

$signedData = SKA\signatureToDict(
    "user", 
    "your-secret_key", 
    [
        "email" => "john.doe@mail.example.com",
        "first_name" => "John",
        "last_name" => "Doe",
    ]
);
print_r($signedData);

示例输出

Array
(
    [signature] => B0sscS+xXWU+NR+9dBCoGFnDtlw=
    [auth_user] => user
    [valid_until] => 1631797926.0
    [extra] => email,first_name,last_name
    [email] => john.doe@mail.example.com
    [first_name] => John
    [last_name] => Doe
)

选项和默认值

signatureToDict函数接受一个可选的$options参数。

$optionsvalidUntil的默认值是从现在起的10分钟。如果您想让它不同,请设置signatureToDict函数中的$options中的validUntil

签名的默认有效期是10分钟(600秒)。如果您想让它不同,请设置signatureToDict函数中的$options中的lifetime

包含生成的签名值的(GET)参数的默认名称是signature。如果您想让它不同,请设置signatureToDict函数中的$options中的signatureParam

包含authUser值的(GET)参数的默认名称是auth_user。如果您想让它不同,请设置signatureToDict函数中的$options中的authUserParam

包含validUntil值的(GET)参数的默认名称是valid_until。如果您想让它不同,请设置signatureToDict函数中的$options中的validUntilParam

默认的(GET)参数名称为 extra,用于保存额外的值。如果您希望它有所不同,请设置 signatureToDict 函数的 $options 中的 extraParam

$signedData = SKA\signatureToDict(
    "user", 
    "your-secret_key", 
    [
        "email" => "john.doe@mail.example.com",
        "first_name" => "John",
        "last_name" => "Doe",
    ],
    [
        "authUserParam" => "webshop_id"  
    ]
)
print_r($signedData);

示例输出

Array
(
    [signature] => nu0Un+05z/cNOFnLwQnigoW/KmA=
    [webshop_id] => user
    [valid_until] => 1631799172.0
    [extra] => email,first_name,last_name
    [email] => john.doe@mail.example.com
    [first_name] => John
    [last_name] => Doe
)

接收方

验证签名请求数据非常简单,如下所示。

验证签名请求

验证签名请求数据。注意,$data 的值应为一个字典;以下以 $request->GET 为例。

$validationResult = SKA\validateSignedRequestData(
    $request->GET, // Note, that `$request->GET` is given as example.
    "your-secret_key"
);

选项和默认值

signatureToDict 函数类似,validateSignedRequestData 也接受多个可选参数(这些参数已在上面描述)

  • signatureParam
  • authUserParam
  • validUntilParam
  • extraParam

经过一些自定义后,将看起来如下

$validationResult = SKA\validateSignedRequestData(
    $request->GET,
    "your-secret_key",
    [
        "authUserParam" => "webshop_id"
    ]
);

测试

只需简单输入

composer test

代码风格

使用 Prettier 进行格式化。

npx prettier --write .

许可证

MIT

支持

如有任何问题,请通过作者部分提供的电子邮件与我联系。

作者

Artur Barseghyan artur.barseghyan@gmail.com