hashsrv is a web service that performs hashing, encryption, encoding, and compression.
A configuration file in TOML format is used to set up hashsrv, but environment variables and command-line options may be used as well.
hashsrv URLs are composed of commands that describe what to do with the given data. For instance, posting data to:
/md5/hex
will calculate the MD5 hash of the posted data, convert it to hex encoding, and respond with the result.
hashsrv implements a simple processing engine that has a stack and a dictionary to store variables. Initially, the data posted via HTTP is pushed onto the stack. Most operations consume data from the stack and push their results onto the stack.
Additional arguments to operations can be placed onto the stack as literals. For instance, to generate 20 bytes of cryptographically random data and convert it to base64, use:
/20/rand/base64
You should issue a GET request for that because no POST data is required.
Items in the URL that are not keywords are placed onto the stack. At the end of the list of commands, the stack should have a single value to use as the result of the request, or else an error occurs.
Named variables can be saved and loaded from a dictionary. See the load and save commands. The dictionary is initialized with HTTP headers that begin with Hashsrv-
(with the prefix removed). So, to pass a variable called key
into the dictionary, you can send an HTTP header called Hashsrv-Key
.
As a convenience, the dictionary is initialized with the following values:
- body - the original request body
- key - initialized with a default key
- A number of standard combinations that you can invoke with the
call
command.
To output a debug view instead of the result, add ?debug=1 to the URL.
Command | Stack in | Stack out | Description |
---|---|---|---|
md5 | Data | Hash | Hashes data using MD5 |
sha1 | Data | Hash | Hashes data using SHA1 |
sha224 | Data | Hash | Hashes data using SHA224 |
sha256 | Data | Hash | Hashes data using SHA256 |
sha384 | Data | Hash | Hashes data using SHA384 |
sha512 | Data | Hash | Hashes data using SHA512 |
ripemd160 | Data | Hash | Hashes data using RIPEMD160 |
hmac-md5 | Data, Key | Hash | HMAC hashes data using MD5 |
hmac-sha1 | Data, Key | Hash | HMAC hashes data using SHA1 |
hmac-sha224 | Data, Key | Hash | HMAC hashes data using SHA2 224-bit |
hmac-sha256 | Data, Key | Hash | HMAC hashes data using SHA2 256-bit |
hmac-sha384 | Data, Key | Hash | HMAC hashes data using SHA2 384-bit |
hmac-sha512 | Data, Key | Hash | HMAC hashes data using SHA2 512-bit |
hmac-ripemd160 | Data, Key | Hash | HMAC hashes data using RIPEMD160 |
md5-len | 16 | Returns the number of bytes for MD5 | |
sha1-len | 20 | Returns the number of bytes for SHA1 | |
sha224-len | 28 | Returns the number of bytes for SHA224 | |
sha256-len | 32 | Returns the number of bytes for SHA256 | |
sha384-len | 48 | Returns the number of bytes for SHA384 | |
sha512-len | 64 | Returns the number of bytes for SHA512 | |
ripemd160-len | 20 | Returns the number of bytes for RIPEMD160 |
Note: When using HMAC, it is customary to hash the key using the same hash function defined for that version of HMAC. You must do that yourself. For instance, when using hmac-sha256, the key should be hashed with sha256 and then used for HMAC.
Command | Stack in | Stack out | Description |
---|---|---|---|
hex | Data | EncodedData | Encode the data as hex |
unhex | EncodedData | Data | Decode the data as hex |
ascii85 | Data | EncodedData | Encode data as ASCII-85 |
unascii85 | EncodedData | Data | Decode data as ASCII-85 |
base32 | Data | EncodedData | Encode data as BASE-32 |
unbase32 | EncodedData | Data | Decode data as BASE-32 |
base32-hex | Data | EncodedData | Encode data as BASE-32 Hex |
unbase32-hex | EncodedData | Data | Decode data as BASE-32 Hex |
base64 | Data | EncodedData | Encode data as BASE-64 |
unbase64 | EncodedData | Data | Decode data as BASE-64 |
base64-url | Data | EncodedData | Encode data as BASE-64 URL |
unbase64-url | EncodedData | Data | Decode data as BASE-64 URL |
Command | Stack in | Stack out | Description |
---|---|---|---|
adler32 | Data | Checksum | Compute the Adler-32 checksum |
crc32 | Data | Checksum | Compute the CRC-32 checksum using the IEEE polynomial |
crc32-ieee | Data | Checksum | Compute the CRC-32 checksum using the IEEE polynomial |
crc32-castagnoli | Data | Checksum | Compute the CRC-32 checksum using the Castagnoli polynomial |
crc32-koopman | Data | Checksum | Compute the CRC-32 checksum using the Koopman polynomial |
crc64-iso | Data | Checksum | Compute the CRC-64 checksum using the ISO polynomial |
crc64-ecma | Data | Checksum | Compute the CRC-64 checksum using the ECMA polynomial |
fnv32 | Data | Hash | Compute the FNV-1 non-cryptographic hash for 32-bits |
fnv32a | Data | Hash | Compute the FNV-1a non-cryptographic hash for 32-bits |
fnv64 | Data | Hash | Compute the FNV-1 non-cryptographic hash for 64-bits |
fnv64a | Data | Hash | Compute the FNV-1a non-cryptographic hash for 64-bits |
Command | Stack in | Stack out | Description |
---|---|---|---|
snappy | Data | Compressed | Compresses data using the Snappy algorithm |
unsnappy | Compressed | Data | Decompresses data using the Snappy algorithm |
zlib | Data | Compressed | Compresses data using the zlib algorithm |
unzlib | Compressed | Data | Decompresses data using the zlib algorithm |
deflate | Data, Factor | Compressed | Compresses data using the flate algorithm - stack contains a compression factor where -1 is default and 0-9 controls compression (0 is none, and 9 is the most) |
inflate | Compressed | Data | Decompresses data using the flate algorithm |
gzip | Data, Factor | Compressed | Compresses data using the gzip algorithm - stack contains a compression factor where -1 is default, 0 is none, 1 is best speed, and 9 is best size |
ungzip | Compressed | Data | Decompresses data using the gzip algorithm |
unbzip2 | Compressed | Data | Decompresses data using the bzip2 algorithm |
lzw-lsb | Data, Bits | Compressed | Compresses data using the lzw algorithm - stack contains the number of bits to use for literal codes, typically 8 but can be 2-8. This version uses least significant bit ordering as used in the GIF file format. |
unlzw-lsb | Compressed, Bits | Data | Decompresses data using the lzw algorithm - stack contains the number of bits to use for literal codes, typically 8 but can be 2-8. This version uses least significant bit ordering as used in the GIF file format. |
lzw-msb | Data, Bits | Compressed | Compresses data using the lzw algorithm - stack contains the number of bits to use for literal codes, typically 8 but can be 2-8. This version uses most significant bit ordering as used in the TIFF and PDF file formats. |
unlzw-msb | Compressed, Bits | Compressed | Decompresses data using the lzw algorithm - stack contains the number of bits to use for literal codes, typically 8 but can be 2-8. This version uses most significant bit ordering as used in the TIFF and PDF file formats. |
Command | Stack in | Stack out | Description |
---|---|---|---|
push | Data | Data, Data | Duplicates the value on the top of the stack |
pop | Data | Pops the value off the top of the stack (effectively discarding) | |
load | Name | Value | Pushes a named value from the dictinary onto the stack |
save | Value, Name | Pops a value from the stack and places it into the dictionary | |
swap | Val1, Val2 | Val2, Val1 | Swaps the two values at the top of the stack |
append | Val1, Val2 | Appended | Appends the value on the top of the stack to the previous value on the stack |
slice | Data | SliceOfData | Slices the value on the stack, taking elements from start to end on the stack. Use -1 for values from the beginning or end. One example is /9/20/slice which takes elements 9 through 19, or /2/-1/slice which takes elements 2 through the end. |
len | Data | Data, Length | Pushes the length of the value on the stack in bytes onto the stack |
left | Data, Count | SliceOfData | Takes the leftmost bytes of data |
right | Data, Count | SliceOfData | Takes the rightmost bytes of data |
snip | Data, Pos | Data1, Data2 | Snips the data in half at the given position, resulting in two values on the stack |
eq | Data1, Data2 | Fails the command unless the two data elements are equal | |
neq | Data1, Data2 | Fails the command unless the two data elements are not equal | |
call | Name | (Varies) | Loads the named value from the dictionary and executes the commands contained there (formatted like normal - /md5/hex for example) |
Command | Stack in | Stack out | Description |
---|---|---|---|
rand | Count | Data | Generates cryptographically random bytes given the count on the stack |
aes-blocksize | 16 | Pushes the AES block size on the stack | |
aes-cfb | Data, IV, Key | Data | Encrypts data using the given IV and 16-byte Key, placing the ciphertext back on the stack. Uses AES encryption and the CFB block mode. |
unaes-cfb | Data, IV, Key | Data | Decrypts data using the given IV and 16-byte Key, placing the plaintext back on the stack. Uses AES encryption and the CFB block mode. |
aes-ofb | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 16-byte Key, placing the result back on the stack. Uses AES encryption and the OFB block mode. |
aes-ctr | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 16-byte Key, placing the result back on the stack. Uses AES encryption and the CTR block mode. |
des-blocksize | 8 | Pushes the DES block size on the stack | |
des-cfb | Data, IV, Key | Data | Encrypts data using the given IV and 8-byte Key, placing the ciphertext back on the stack. Uses DES encryption and the CFB block mode. |
undes-cfb | Data, IV, Key | Data | Decrypts data using the given IV and 8-byte Key, placing the plaintext back on the stack. Uses DES encryption and the CFB block mode. |
des-ofb | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 8-byte Key, placing the result back on the stack. Uses DES encryption and the OFB block mode. |
des-ctr | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 8-byte Key, placing the result back on the stack. Uses DES encryption and the CTR block mode. |
3des-blocksize | 8 | Pushes the Triple DES block size on the stack | |
3des-cfb | Data, IV, Key | Data | Encrypts data using the given IV and 24-byte Key, placing the ciphertext back on the stack. Uses Triple DES encryption and the CFB block mode. |
un3des-cfb | Data, IV, Key | Data | Decrypts data using the given IV and 24-byte Key, placing the plaintext back on the stack. Uses Triple DES encryption and the CFB block mode. |
3des-ofb | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 24-byte Key, placing the result back on the stack. Uses Triple DES encryption and the OFB block mode. |
3des-ctr | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 24-byte Key, placing the result back on the stack. Uses Triple DES encryption and the CTR block mode. |
blowfish-blocksize | 8 | Pushes the blowfish block size on the stack | |
blowfish-cfb | Data, IV, Key | Data | Encrypts data using the given IV and 1 to 56-byte Key, placing the ciphertext back on the stack. Uses Blowfish encryption and the CFB block mode. |
unblowfish-cfb | Data, IV, Key | Data | Decrypts data using the given IV and 1 to 56-byte Key, placing the plaintext back on the stack. Uses Blowfish encryption and the CFB block mode. |
blowfish-ofb | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 1 to 56-byte Key, placing the result back on the stack. Uses Blowfish encryption and the OFB block mode. |
blowfish-ctr | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 1 to 56-byte Key, placing the result back on the stack. Uses Blowfish encryption and the CTR block mode. |
blowfish-salt-cfb | Data, IV, Key, Salt | Data | Encrypts data using the given IV and 1 to 56-byte Key, placing the ciphertext back on the stack. Uses Blowfish encryption and the CFB block mode. |
unblowfish-salt-cfb | Data, IV, Key, Salt | Data | Decrypts data using the given IV and 1 to 56-byte Key, placing the plaintext back on the stack. Uses Blowfish encryption and the CFB block mode. |
blowfish-salt-ofb | Data, IV, Key, Salt | Data | Encrypts or decrypts data using the given IV and 1 to 56-byte Key, placing the result back on the stack. Uses Blowfish encryption and the OFB block mode. |
blowfish-salt-ctr | Data, IV, Key, Salt | Data | Encrypts or decrypts data using the given IV and 1 to 56-byte Key, placing the result back on the stack. Uses Blowfish encryption and the CTR block mode. |
twofish-blocksize | 16 | Pushes the twofish block size on the stack | |
twofish-cfb | Data, IV, Key | Data | Encrypts data using the given IV and 16, 24, or 32-byte Key, placing the ciphertext back on the stack. Uses Twofish encryption and the CFB block mode. |
untwofish-cfb | Data, IV, Key | Data | Decrypts data using the given IV and 16, 24, or 32-byte Key, placing the plaintext back on the stack. Uses Twofish encryption and the CFB block mode. |
twofish-ofb | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 16, 24, or 32-byte Key, placing the result back on the stack. Uses Twofish encryption and the OFB block mode. |
twofish-ctr | Data, IV, Key | Data | Encrypts or decrypts data using the given IV and 16, 24, or 32-byte Key, placing the result back on the stack. Uses Twofish encryption and the CTR block mode. |
The initialization vector (IV) is used by many routines. It does not need to be kept secure, but it should generally be random and different for each different encryption run. It can easily be generated with the rand
function. However, you need to keep it for decryption. It is customary to put it at the beginning of the encrypted data. These routines don't do that for you.
Each encryption routine supports several block modes. Some of the block modes are symmetrical - so you use the same function to encrypt and decrypt. Others are not.
Some routines require fixed key sizes, others are variable. Keys can be any data. It is usually considered more secure when these keys are relatively random or hashed.
- Control - loop (to go through lines of text and do batch operations)
- Specialized - protect, unprotect
URL | Result |
---|---|
POST / | Returns what you posted |
POST /sha256 | Returns SHA256 hash as binary data |
POST /sha256/hex | Returns SHA256 hash as hex encoding |
POST /unhex/snappy/hex | Decodes hex data, compresses it using Snappy, and encodes the result to hex |
GET /Hello%20World/32/rand/md5/hmac-md5/hex | Pushes "Hello World" on the stach, generates 32 bytes of random data as the HMAC key (which is then hashed with md5), computes the HMAC-MD5 hash, and converts the result to hex. Try It! |
POST /MyKeyHere/sha512/hmac-sha512/base64-url | Hashes the data with HMAC-SHA512 using the the sha512 hash of the key "MyKeyHere" and returns it as base64. |
All you need is your configuration file and the hashsrv binary for your platform. You can run it manually or as a service on Windows or Linux (see below).
To test with the default configuration file and logging:
./hashsrv -run
To run in the background:
./hashsrv -run &
To keep it running after you log off:
nohup ./hashsrv -run &
nohup
is a Linux utility that keeps a process going after you log off.
The only required files are the hashsrv binary and the configuration file. The hashsrv has minimal dependencies - just a few shared libraries that should already be on the operating system.
On all operating systems, you may override the configuration file location using the HASHSRV_CONFIG
environment variable or the -config
command-line option, which takes precedence. See below for where to place the configuration file when none of these are present.
The location of the configuration file is based on the location of the hashsrv binary. /usr/bin
and /bin
locations are replaced with /etc
- so effectively, the configuration file is located in the etc
folder that corresponds to the bin
folder. If the binary is not in a bin
folder, then the configuration file is expected to be in the same folder as the binary. Some examples are shown below.
hashsrv binary location | Default configuration file location |
---|---|
/bin/hashsrv | /etc/hashsrv.config |
/usr/bin/hashsrv | /etc/hashsrv.config |
/usr/local/bin/hashsrv | /usr/local/etc/hashsrv.config |
/usr/local/bin/foo/hashsrv | /usr/local/etc/foo/hashsrv.config |
/usr/local/foo/bin/hashsrv | /usr/local/foo/etc/hashsrv.config |
c:\hashsrv\bin\hashsrv.exe | c:\hashsrv\etc\hashsrv.config |
c:\files\hashsrv.exe | c:\files\hashsrv.config |
/home/michael/hashsrv | /home/michael/hashsrv.config |
You can install the hashsrv as a service on Windows or Linux with Upstart. Use the -install
and -remove
options to install or remove the hashsrv.
On Linux, the -install option created a HashSrv.conf
file in /etc/init
. To start or stop the hashsrv, you can use:
sudo start HashSrv
sudo stop HashSrv
If the service doesn't start, most likely the configuration file has a problem.
On Windows, the hashsrv uses the Service API. Use the Service administration tool to start or stop the hashsrv.
Also, you will need to use the -run
option if you want to run the application standalone (not as a service).
Option | Default | Description |
---|---|---|
HASHSRV_CONFIG | hashsrv.config (see above) | Specifies the default location of the configuration file |
Option | Default | Description |
---|---|---|
-addr | ":9009" | Address to serve |
-config | HASHSRV_CONFIG environment variable | Use to override the configuration file |
-cpuprofile | Write CPU profile to file | |
-memprofile | Write memory profile to file | |
-help | false | Show command help |
-noisy | false | Enable logging |
-install | false | Install hashsrv as a service |
-remove | false | Remove the hashsrv service |
-run | false | Run hashsrv standalone (not as a service) |
-start | false | Start the hashsrv service |
-stop | false | Stop the hashsrv service |
Option | Default | Description |
---|---|---|
addr | ":9009" | Web server address |