
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 output is designed to reduce any decipheral character usage patterns.
Morus is a small effort in a larger project that necessitated secure postMessage communications. While sent messages are "private" (between the sending routine and recieving window), received messages are "public" (any one can listen in).
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 (using the same-named methods).
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 random substitution-table and initial index, via .map and .shift properties, respectively. These properties may be (1) passed to new instances, and/or (2) copied directly, between instances. Below demonstrates both ways which ensure multiple Morus instances encode and decode text in the same manner.
var
cipherA = new Morus(),
// (1) pass properties to the constructor
cipherB = new Morus(cipherA.shift, cipherA.map),
cipherC = new Morus();
// (2) directly copy properties between instances
cipherC.map = cipherB.map;
cipherC.shift = cipherB.shift;
console.log(cipherA.encode('obfuscate me'));
console.log(cipherB.encode('obfuscate me'));
console.log(cipherC.encode('obfuscate me'));
// outputs the same (encoded) string three times
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 a bug 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>
npm install morus if you're using npmcomponent install bemson/morus if you're using componentbower install morus if you're using BowerAssuming you have a require.js compatible loader, configure an alias for the morus module (the alias "morus" is recommended, for consistency). The morus module exports a Morus constructor, not a module namespace.
require.config({
paths: {
morus: 'libs/morus'
}
});
Then require and use the module in your application code:
require(['morus'], function (Morus) {
// ... Morus dependent code ...
});
Morus has unit tests written with Mocha, using Chai and Sinon (via the Sinon-chai plugin).
npm testMorus 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 2 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.