StringThing is a lightweight library for encoding and decoding strings using various patterns.
npm install string-thingStringThing provides an API for encoding and decoding strings. To use it, import the StringThing class and create a new instance with an array of patterns in the order you want to use them:
import{StringThing}from'string-thing';constmyString='This is my string';// Create a new instance of StringThing with default pattern (['split-halves', 'reverse', 'shift', 'swap-case', 'rotate'])constmyStringThing=newStringThing();// Encode the stringconstencoded=myStringThing.encode(myString);// Output the encoded stringconsole.log(encoded);// "ZN!TJ!TJIuHOJSUT!"// Decode the stringconstdecoded=myStringThing.decode(encoded);// Output the decoded stringconsole.log(decoded);// "This is my string"StringThing patterns currently support the following operations:
split-halves: Splits the string into two halves and swaps them.Abcd12=>d12Abc
reverse: Reverses the order of the characters in the string.Abcd12=>21dcbA
shift: Shifts the characters in the string up by 1 in the ASCII table.Abcd12=>Bcde23
swap-case: Swaps uppercase & lowercase characters in the string.Abcd12=>aBCD12
rotate: Shifts the string 1 position to the right.Abcd12=>2Abcd1
To use a specific pattern, pass it as an argument to the StringThing constructor:
import{StringThing,PatternOp}from'string-thing';constmyStringThing1=newStringThing(['split-halves','shift','reverse','shift','swap-case','rotate']);// ORconststringThingPattern: PatternOp[]=['split-halves','shift','reverse','shift','swap-case','rotate'];constmyStringThing2=newStringThing(stringThingPattern);StringThing can be used to encode passwords before hashing them and storing them in a database, making it more difficult for an attacker to retrieve the original password even if they gain access to the database.
Here's an example of how to use StringThing to encode a password before hashing it with bcrypt when working with passwords in a database:
importbcryptfrom'bcrypt';import{StringThing}from'string-thing';import{stringThingPattern}from'./secrets';// export const stringThingPattern: PatternOp[] = ['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate'];// Generate a salt for the bcrypt hashconstsaltRounds=10;constsalt=awaitbcrypt.genSalt(saltRounds);// The original password to be encoded and hashedconstpassword='myPassword123';// Encode the password using StringThingconstencodedPassword=(newStringThing(stringThingPattern)).encode(password);// Hash the encoded password with bcryptconsthashedPassword=awaitbcrypt.hash(encodedPassword,salt);// Add the hashed password and salt to a user object for storage in a databaseconstuser={username: 'johndoe',email: 'johndoe@example.com',password: hashedPassword,salt: salt,// other user data...};// Add the user object to the databaseawaitmyDatabase.addUser(user);importbcryptfrom'bcrypt';import{StringThing}from'string-thing';import{stringThingPattern}from'./secrets';// export const stringThingPattern: PatternOp[] = ['split-halves', 'shift', 'reverse', 'shift', 'swap-case', 'rotate'];// Retrieve the user's hashed password and salt from the databaseconstuser=awaitmyDatabase.getUserByUsername('johndoe');consthashedPassword=user.password;constsalt=user.salt;// The password entered by the user attempting to log inconstpasswordAttempt='myPassword123';// Encode the password attempt using StringThingconstencodedPasswordAttempt=(newStringThing(stringThingPattern)).encode(passwordAttempt);// Hash the encoded password attempt with bcrypt using the stored saltconsthashedPasswordAttempt=awaitbcrypt.hash(encodedPasswordAttempt,salt);// Compare the hashed password attempt to the stored hashed passwordif(hashedPasswordAttempt===hashedPassword){// Passwords match - login successful!}else{// Passwords do not match - login failed}