intencoder

package module
v0.0.0-...-44b879d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 10, 2024 License: MIT Imports: 5 Imported by: 0

README

intencoder-go

A UInt64 obfuscation encoder for sequencial ID

Motivation

In a simple RDB-based web system, using sequential IDs for entities is not ideal. Such practice allows for the estimation of the business size and increases the risk of ID-guessing attacks.

This library provides a reversible transformation to obfuscate a uint64 into a hard-to-guess string. The resulting string ranges from a minimum of 7 to a maximum of 15 characters (or an array with a minimum of 4 bytes to a maximum of 9 bytes).

  • up to 2^24-1 : 7 chars
  • up to 2^32-1 : 8
  • up to 2^40-1 : 10
  • up to 2^48-1 : 12
  • up to 2^56-1 : 13
  • up to 2^64-1 : 15

To enhance human readability, the encoder utilizes a restricted character set based on base32 encoding. This avoids characters like "0" and "O", "1" and "I", and especially "Q" and "9", as these pairs are easily confused in pronunciation in Japanese ("kyu-").

Example

Code Decimal Value Hexadecimal Value
KM4F-DLY 0 0x0
DWE3-QNI 17 0x11
Z3FR-Y4Q 4386 0x1122
GBDK-3DY 1122867 0x112233
WJF3-LN4L 287454020 0x11223344
A6NH-TF27-HI 73588229205 0x1122334455
5EZH-4LSJ-TKRQ 18838586676582 0x112233445566
W43I-TY3I-MLSI-C 4822678189205111 0x11223344556677
VXQB-FS37-LKNN-HAA 1234605616436508552 0x1122334455667788

How to use

TBD

options
  • change/remove delimiter character
  • keep enough string length for smaller values
Learning

Initially, I attempted to use the Feistel algorithm, but it did not effectively obscure the change in bits across a sequence of original values.

To address this, I added a nonce byte and created a different SHA-256 hash from a salt and nonce. The encryption is performed using a simple XOR operation with the hash.

other notes
  • golang hash function performance comparison:
MD5   : 1.074252ms
SHA1  : 1.11365ms
SHA256: 771.172µs
SHA512: 2.29784ms

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type IntEncoder

type IntEncoder struct {
	// contains filtered or unexported fields
}

func NewIntEncoder

func NewIntEncoder(salt string) *IntEncoder

func (*IntEncoder) Decode

func (encoder *IntEncoder) Decode(data string) (uint64, error)

func (*IntEncoder) Encode

func (encoder *IntEncoder) Encode(data uint64) string

func (*IntEncoder) WithDelimiter

func (encoder *IntEncoder) WithDelimiter(delimiter string) *IntEncoder

func (*IntEncoder) WithMinByteLength

func (encoder *IntEncoder) WithMinByteLength(minByteLength int) *IntEncoder

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL