DEV Community

Arief Warazuhudien
Arief Warazuhudien

Posted on

ReST API Body Payload Signature

A body payload signature in a REST API refers to a digital signature that is generated based on the contents of the HTTP request body. This signature is usually used to ensure the integrity and authenticity of the message payload being transmitted between the client and the server.

To generate a payload signature, a hash function is applied to the body of the HTTP request message. The resulting hash value is then encrypted using a private key, which is known only to the sender. This encrypted value, along with the public key of the sender, is then included in the HTTP request headers as an additional piece of metadata.

On the server-side, the server uses the public key of the sender to decrypt the encrypted payload signature. The server then applies the same hash function to the request body and compares the resulting hash value with the decrypted payload signature. If they match, the server can be confident that the payload has not been tampered with and that the message is authentic.

Payload signatures are often used in APIs that deal with sensitive data or where data integrity is critical, such as payment gateways, banking APIs, and authentication services.

Why it needed

A body payload signature in a REST API is needed for several reasons:

  1. Data Integrity: One of the most important reasons for using a payload signature is to ensure data integrity. By using a hash function to generate a signature of the request body, any tampering with the request payload by a third party can be detected.
  2. Authentication: Payload signatures can be used to authenticate the sender of the request. Since the signature is generated using a private key known only to the sender, the server can be confident that the request is from an authorized party.
  3. Non-repudiation: Payload signatures can also provide non-repudiation, which means that the sender cannot deny having sent the message. This is because the signature is generated using a private key known only to the sender, and thus only the sender could have generated the signature.
  4. Security: Payload signatures provide an additional layer of security to APIs that deal with sensitive data, such as financial or health information. By using a payload signature, the API can ensure that the data being transmitted is not only authentic but has not been tampered with in transit.

In summary, using a body payload signature in a REST API is important for ensuring data integrity, authentication, non-repudiation, and security. It is especially critical in APIs that deal with sensitive data where ensuring the authenticity and integrity of the data is of utmost importance.

Common Method

The common method to generate a payload signature in a REST API is to use a combination of hash functions and digital signatures.

The general process for generating a payload signature in a REST API is as follows:

  1. The client generates a hash value of the request body using a hash function, such as SHA-256.
  2. The client encrypts the hash value using its private key to generate a digital signature.
  3. The client includes the digital signature in the HTTP request headers, along with its public key.
  4. The server receives the HTTP request and retrieves the public key of the client from the headers.
  5. The server decrypts the digital signature using the client's public key to retrieve the original hash value.
  6. The server generates a new hash value of the request body using the same hash function as the client.
  7. The server compares the decrypted hash value with the newly generated hash value. If they match, the server can be confident that the request body has not been tampered with in transit.

There are several libraries and tools available for generating and verifying payload signatures in REST APIs, including OpenSSL, JSON Web Tokens (JWT), and Amazon Web Services' Signature Version 4. These libraries and tools often provide a simple and standardized way to generate and verify payload signatures in REST APIs, which can save time and ensure consistency across applications.

Example

Here's an example of a REST API request with a payload signature in the headers:

POST /api/v1/transactions HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer <access_token>
X-Payload-Signature: RSA-SHA256;BtSqbBtjaZItuzVHXj4Ku4x4i4M1uQX7Y/lz64OuSbMy8=

{
  "amount": 100.00,
  "currency": "USD",
  "recipient": "John Doe",
  "account": "1234567890"
}

Enter fullscreen mode Exit fullscreen mode

In this example, the client is making a POST request to an API endpoint for creating a new transaction. The request body contains the details of the transaction, such as the amount, currency, recipient, and account.

The headers of the request include the Content-Type, which specifies that the request body is in JSON format, and the Authorization header, which contains the access token for authentication.

The X-Payload-Signature header contains the signature of the request body. In this case, the signature was generated using RSA-SHA256 algorithm and is represented as a base64-encoded string.

When the server receives the request, it retrieves the public key associated with the sender's private key, which was used to generate the signature. The server then uses the same algorithm to generate a hash of the request body and compares it to the decrypted hash value obtained from the signature. If the two hash values match, the server can be confident that the request body has not been tampered with and is authentic.

Conclusion

In conclusion, using a body payload signature in a REST API is a common and effective way to ensure data integrity, authentication, non-repudiation, and security. A payload signature is generated by using a hash function and digital signatures to verify the contents of the HTTP request body. This method provides an additional layer of security for APIs that deal with sensitive data, such as financial or health information.

In the example provided, the request body contains the details of a transaction, and the X-Payload-Signature header contains the signature of the request body generated using the RSA-SHA256 algorithm. The server verifies the signature by retrieving the public key of the sender from the headers, decrypting the signature, and comparing the decrypted hash value to the hash value of the request body. If the hash values match, the server can be confident that the request body is authentic and has not been tampered with.

Top comments (2)

Collapse
 
andirady profile image
andirady

I think the Bearer token is redundant.
Like @megasuperlexa mentioned, should just use the Authorization header and pass the request signature as the header value. The signature can be generated using HMAC+SHA256.

Collapse
 
megasuperlexa profile image
megasuperlexa

why not use Authirization header for signature?