| --- |
| title: HMAC Generate Signature Examples |
| --- |
| |
| <!-- |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| --> |
| |
| ## Python 3 |
| |
| ```python |
| import base64 |
| import hashlib |
| import hmac |
| |
| secret = bytes('the shared secret key here', 'utf-8') |
| message = bytes('this is signature string', 'utf-8') |
| |
| |
| hash = hmac.new(secret, message, hashlib.sha256) |
| |
| # to lowercase hexits |
| hash.hexdigest() |
| |
| # to lowercase base64 |
| base64.b64encode(hash.digest()) |
| ``` |
| |
| ## Java |
| |
| ```java |
| import javax.crypto.Mac; |
| import javax.crypto.spec.SecretKeySpec; |
| import java.security.InvalidKeyException; |
| import java.security.NoSuchAlgorithmException; |
| import javax.xml.bind.DatatypeConverter; |
| |
| class Main { |
| public static void main(String[] args) { |
| try { |
| String secret = "the shared secret key here"; |
| String message = "this is signature string"; |
| |
| Mac hasher = Mac.getInstance("HmacSHA256"); |
| hasher.init(new SecretKeySpec(secret.getBytes(), "HmacSHA256")); |
| |
| byte[] hash = hasher.doFinal(message.getBytes()); |
| |
| // to lowercase hexits |
| DatatypeConverter.printHexBinary(hash); |
| |
| // to base64 |
| DatatypeConverter.printBase64Binary(hash); |
| } |
| catch (NoSuchAlgorithmException e) {} |
| catch (InvalidKeyException e) {} |
| } |
| } |
| ``` |
| |
| ## Go |
| |
| ```go |
| package main |
| |
| import ( |
| "crypto/hmac" |
| "crypto/sha256" |
| "encoding/base64" |
| "encoding/hex" |
| ) |
| |
| func main() { |
| secret := []byte("the shared secret key here") |
| message := []byte("this is signature string") |
| |
| hash := hmac.New(sha256.New, secret) |
| hash.Write(message) |
| |
| // to lowercase hexits |
| hex.EncodeToString(hash.Sum(nil)) |
| |
| // to base64 |
| base64.StdEncoding.EncodeToString(hash.Sum(nil)) |
| } |
| ``` |
| |
| ## Ruby |
| |
| ```ruby |
| require 'base64' |
| require 'openssl' |
| |
| secret = 'the shared secret key here' |
| message = 'this is signature string' |
| |
| # to lowercase hexits |
| OpenSSL::HMAC.hexdigest('sha256', secret, message) |
| |
| # to base64 |
| Base64.encode64(OpenSSL::HMAC.digest('sha256', secret, message)) |
| ``` |
| |
| ## NodeJs |
| |
| ```js |
| var crypto = require('crypto'); |
| |
| var secret = 'the shared secret key here'; |
| var message = 'this is signature string'; |
| |
| var hash = crypto.createHmac('sha256', secret).update(message); |
| |
| // to lowercase hexits |
| hash.digest('hex'); |
| |
| // to base64 |
| hash.digest('base64'); |
| ``` |
| |
| ## JavaScript ES6 |
| |
| ```js |
| const secret = 'the shared secret key here'; |
| const message = 'this is signature string'; |
| |
| const getUtf8Bytes = str => |
| new Uint8Array( |
| [...unescape(encodeURIComponent(str))].map(c => c.charCodeAt(0)) |
| ); |
| |
| const secretBytes = getUtf8Bytes(secret); |
| const messageBytes = getUtf8Bytes(message); |
| |
| const cryptoKey = await crypto.subtle.importKey( |
| 'raw', secretBytes, { name: 'HMAC', hash: 'SHA-256' }, |
| true, ['sign'] |
| ); |
| const sig = await crypto.subtle.sign('HMAC', cryptoKey, messageBytes); |
| |
| // to lowercase hexits |
| [...new Uint8Array(sig)].map(b => b.toString(16).padStart(2, '0')).join(''); |
| |
| // to base64 |
| btoa(String.fromCharCode(...new Uint8Array(sig))); |
| ``` |
| |
| ## PHP |
| |
| ```php |
| <?php |
| |
| $secret = 'the shared secret key here'; |
| $message = 'this is signature string'; |
| |
| // to lowercase hexits |
| hash_hmac('sha256', $message, $secret); |
| |
| // to base64 |
| base64_encode(hash_hmac('sha256', $message, $secret, true)); |
| ``` |
| |
| ## Lua |
| |
| ```lua |
| local hmac = require("resty.hmac") |
| local secret = 'the shared secret key here' |
| local message = 'this is signature string' |
| local digest = hmac:new(secret, hmac.ALGOS.SHA256):final(message) |
| |
| --to lowercase hexits |
| ngx.say(digest) |
| |
| --to base64 |
| ngx.say(ngx.encode_base64(digest)) |
| ``` |
| |
| ## Shell |
| |
| ```bash |
| SECRET="the shared secret key here" |
| MESSAGE="this is signature string" |
| |
| # to lowercase hexits |
| echo -e $MESSAGE | openssl dgst -sha256 -hmac $SECRET |
| |
| # to base64 |
| echo -e $MESSAGE | openssl dgst -sha256 -hmac $SECRET -binary | base64 |
| ``` |