
Research
/Security News
Miasma Mini Shai-Hulud Hits ImmobiliareLabs npm Packages
Miasma Mini Shai-Hulud hits @immobiliarelabs Backstage plugins, targeting GitLab and LDAP auth packages on npm.
A progressive substitution cipher
by Bemi Faison
Morus is a JavaScript library that uses a random substitution table (or cipher) along with a progressive index, to obfuscate text. The "progressive" part involves shifting the true substitution index by one, per character, in a string. Thus, while Morus is not encryption the encoded output is designed to degrade frequency analysis.
Generally, there is no good reason for client-side obfuscation... So, for all the bad reasons, Morus was designed to be lightweight and effective.
Simply initialize a Morus instance, then encode and decode text.
var
cipher = new Morus(),
phrase = 'Hello world!',
coded = cipher.encode(phrase);
console.log('original:', phrase);
// original: Hello world!
console.log('encoded:', coded, '(output will vary)');
// encoded: W1af)L@3VgaC (output will vary)
console.log('decoded:', cipher.decode(coded));
// decoded: Hello world!
Each Morus instance has a unique "cipher" for translating strings. Morus ciphers consist of a key (i.e., substitution-table) and index, stored in properties of the same name.
To share a cipher, simply copy these properties between instances. To clone a cipher use the cipher() method; it accepts and returns a (more) portable version of these properties. Either approach results in Morus instances that translate strings in the same manner.
Below demonstrates sharing and cloning a cipher between Morus instances, and how the encoded output is the same between all three.
var
instA = new Morus(),
instB = new Morus(),
instC = new Morus();
// copy/reference the cipher properties
instB.key = instA.key;
instB.index = instA.index;
// use the cipher method
instC.cipher(instB.cipher());
// encode the string the same way using different instances
console.log(instA.encode('obfuscate me'));
console.log(instB.encode('obfuscate me'));
console.log(instC.encode('obfuscate me'));
Morus has no dependencies, works within modern JavaScript environments, and is available on bower, component, and npm as a CommonJS (Node) or AMD (RequireJS) module.
If Morus isn't compatible with your favorite runtime, please file an issue or pull-request (preferred).
Use a <SCRIPT> tag to load the morus.min.js file in your web page. Doing so, adds Morus to the global scope.
<script type="text/javascript" src="path/to/morus.min.js"></script>
<script type="text/javascript">
// ... Morus dependent code ...
</script>
Note: The minified file was compressed by Closure Compiler.
npm install moruscomponent install bemson/morusbower install morusAssuming you have a require.js compatible loader, configure an alias for the morus module (the term "morus" is recommended, for consistency). The morus module exports a constructor function, not a module namespace.
require.config({
paths: {
morus: 'my/libs/morus'
}
});
Then require and use the module in your application code:
require(['morus'], function (Morus) {
// ... Morus dependent code ...
});
Morus has unit tests written for Mocha, using Chai and Sinon (via the Sinon-chai plugin).
npm test.Morus is available under the terms of the MIT-License.
Copyright 2014, Bemi Faison
FAQs
A progressive substitution cipher
The npm package morus receives a total of 1 weekly downloads. As such, morus popularity was classified as not popular.
We found that morus demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Miasma Mini Shai-Hulud hits @immobiliarelabs Backstage plugins, targeting GitLab and LDAP auth packages on npm.

Security News
Rolldown paused Rust React Compiler integration after a 5MB binary size increase raised concerns about shipping React-specific code to all Vite users.

Security News
/Research
Mini Shai-Hulud expands into the Go ecosystem after hitting LeoPlatform npm packages and targeting GitHub Actions workflows.