davidpeach / laravel-hmac-validation-rule
用于验证Hmac签名的规则类
1.0.1
2021-09-14 18:28 UTC
Requires
- php: ^8.0
Requires (Dev)
- orchestra/testbench: ^6.21
- phpunit/phpunit: ^9.5
README
一个用于检查基于您的请求键/值对的任何Hmac哈希的Laravel 规则对象。
安装
composer require davidpeach/laravel-hmac-validation-rule:^1.0
原因
有时您可能希望有额外的保证,即到达预期目的地的数据是发送的确切数据。
我们可以通过使用只有客户端和目的地才知道的秘密密钥(一串随机字符)来“签名”数据来实现这一点。
客户端对数据进行签名,并将其与创建的数据哈希一起发送到目的地。然后目的地在收到请求后,将使用相同的秘密密钥对数据进行哈希处理,并检查其数据哈希是否完全相同。如果不同,您可以忽略并返回错误状态。
示例用法
对于这个例子,假设您正在构建一个端点,该端点将接受一个电子邮件和一个您需要确保未被篡改的名字。
以下是步骤
- 作为API设计者,决定您想要从数据中构建哈希的部分,以及它们的顺序。
- 对于这个例子,让我们假设我们想要使用电子邮件和名字字段来构建哈希。
- 在哈希时,字段应该保持相同的顺序,因为顺序将影响最终的哈希结果。
- 我可能在不久的将来添加一个配置选项,根据键的字母顺序对字段进行排序。
- 在您的请求验证中,像以下示例那样使用Hmac规则对象
use DavidPeach\LaravelHmacValidatorRule\Rules\Hmac; [...] public function store(\Illuminate\Http\Request $request) { $request->validate([ 'email' => ['required', 'email'], 'name' => ['required'], 'hmac' => new Hmac($request->only(['email', 'name'])), ]); }
-
定义
.env
变量HMAC_VALIDATION_SECRET
为您的共享秘密。这将与客户端用于哈希所需字段的相同秘密。 -
客户端发送请求,并附带使用共享秘密计算出的hmac哈希
######################### # Example hashing in PHP ######################### # The data to hash and send. $dataToSend = [ 'email' => 'test@example.com', 'name' => 'David Peach', ]; # Encode data to a JSON string. $jsonEncodedDataString = json_encode($dataToSend); # Calculate the HMAC hash (sha256 only at the moment) # all the other hash_hmac algorithms will be available soon. $hmacHash = hash_hmac('sha256', $jsonEncodedDataString, 'YOUR_SHARED_SECRET'); # Add the calculated HMAC hash on to the data to send. $dataToSend['hmac'] = $hmacHash; # Send the request to the endpoint.
向您的端点发送数据的客户端应使用与您传递给Hmac规则对象的顺序相同的顺序对数据进行json编码。然后,他们应该计算该json字符串的Hmac哈希,并将其与请求一起传递。在这个例子中,它作为键hmac
,但它可以是任何键)。目前只支持sha256
算法,但很快将可配置。