HMAC Signatures
Để đảm bảo tính xác thực và tính toàn vẹn dữ liệu của các request, Fundiin yêu cầu các request này được ký. Chữ ký này được dựa trên HMAC (Hash-based Message Authentication Code) được tính toán bằng cách sử dụng request body và secret key, chỉ có bạn và Fundiin biết.
Chữ ký
Trước khi gửi một yêu cầu tới Fundiin, bạn cần tạo chữ ký và gán vào header. Khi Fundiin nhận được yêu cầu, chữ ký cũng được tạo bằng cách sử dụng request body và secret key, được lưu trữ trên phía Fundiin. Bằng cách xác minh rằng cả hai chữ ký là giống nhau, Fundiin có thể đảm bảo yêu cầu là từ đối tác và không bị sửa đổi trong quá trình truyền tải.
Xác minh Thông báo thanh toán
Bạn cũng có thể xác minh các thông báo thanh toán nhận được từ Fundiin bằng cách tạo chữ ký tương ứng và so sánh nó với chữ ký được gán trong header. Điều này cho phép bạn xác nhận rằng thông báo thanh toán đã được gửi bởi Fundiin và không bị sửa đổi trong quá trình truyền tải.
Tạo Chữ ký
Fundiin sử dụng thuật toán HMAC SHA-256
để tạo chữ ký
signature = HMAC(algorihtm, secretKey, body)
With:
- algorithm: Thuật toán bảo mật. Giá trị mặc định của thuật toán được sử dụng là
HMAC SHA-256
. - secretKey: Key được cung cấp bởi Fundiin trong quá trình đăng ký.
- body: Dữ liệu được sử dụng để tạo chữ ký
Vui lòng đảm bảo thực hiện quá trình tạo chữ ký này chính xác để đảm bảo việc giao tiếp với API của Fundiin là an toàn và xác thực.
Chữ ký HMAC SHA-256
được tạo bằng cách sử dụng request body và secret key được cung cấp, sau đó được mã hóa dưới định dạng hexa.
Cách tạo chữ ký HMAC SHA-256
cho các ngôn ngữ lập trình thông dụng:
- Java
- Node
- .NET
- PHP
- PYTHON
- GO
- RUBY
- PERL
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class SignatureGenerator {
public static String generateHmacSHA256Signature(String secretKey, String data) {
try {
Mac hmacSHA256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
hmacSHA256.init(secretKeySpec);
byte[] hash = hmacSHA256.doFinal(data.getBytes());
StringBuilder result = new StringBuilder();
for (byte b : hash) {
result.append(String.format("%02x", b));
}
return result.toString();
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
return null;
}
}
}
const crypto = require('crypto');
function generateHmacSHA256Signature(secretKey, data) {
const hmac = crypto.createHmac('sha256', secretKey);
hmac.update(data);
return hmac.digest('hex');
}
using System;
using System.Security.Cryptography;
using System.Text;
public class SignatureGenerator
{
public static string GenerateHmacSHA256Signature(string secretKey, string data)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(secretKey);
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
using (var hmacSHA256 = new HMACSHA256(keyBytes))
{
byte[] hashBytes = hmacSHA256.ComputeHash(dataBytes);
StringBuilder result = new StringBuilder();
foreach (byte b in hashBytes)
{
result.Append(b.ToString("x2"));
}
return result.ToString();
}
}
}
function generateHmacSHA256Signature($secretKey, $data)
{
$hash = hash_hmac('sha256', $data, $secretKey, true);
return bin2hex($hash);
}
import hashlib
import hmac
def generate_hmac_sha256_signature(secret_key, data):
message = data.encode('utf-8')
secret = secret_key.encode('utf-8')
signature = hmac.new(secret, message, hashlib.sha256)
return signature.hexdigest()
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
)
func generateHmacSHA256Signature(secretKey, data string) string {
key := []byte(secretKey)
message := []byte(data)
hmacSHA256 := hmac.New(sha256.New, key)
hmacSHA256.Write(message)
hash := hmacSHA256.Sum(nil)
return hex.EncodeToString(hash)
}
require 'openssl'
def generate_hmac_sha256_signature(secret_key, data)
hmac = OpenSSL::HMAC.hexdigest('sha256', secret_key, data)
end
use Digest::SHA qw(hmac_sha256_hex);
sub generate_hmac_sha256_signature {
my ($secret_key, $data) = @_;
my $signature = hmac_sha256_hex($data, $secret_key);
return $signature;
}