Skip to content

Commit

Permalink
stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxGripe committed Jun 23, 2024
1 parent ea3bb1b commit 61842be
Show file tree
Hide file tree
Showing 7 changed files with 277 additions and 3 deletions.
27 changes: 26 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,26 @@
# 0password.github.io
# 0Password

The ultimate password manager that doesn't mess around. It keeps your digital life locked down tighter than Fort Knox, all while remembering absolutely nothing.

## How It Works

1. **0Password** - This is your master key. Keep it safe.
2. **Service** - Where's this password going? Reddit? X? You name it.
3. **Customize** - Choose if you want digits, etc. It's all about that custom touch.
4. **Retrieve** - Hit that button and watch the magic happen. Voilà, your password ready to roll.

## Features

- **Ultra-Secure**: Uses SHA-256 hashing to keep things tight.
- **Customizable**: Tailor your password length and character types.
- **Memory-Free**: We don’t remember a thing.

## Why 0Password?

Because you deserve a password manager that doesn't pretend to be a 1 Memory Palace. Keep it simple, keep it secure, and keep moving.

## Contributing

Feel free to fork, tinker, and send a pull request. Let’s make this the best password manager out there. Happy passwording!


123 changes: 121 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,11 +1,130 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<title>0Password</title>

<script src="js/libs/jquery-1.11.0.min.js"></script>
<script src="js/libs/core-min.js"></script>
<script src="js/libs/enc-base64-min.js"></script>
<script src="js/libs/sha256.js"></script>
<script src="js/0Password.js"></script>

<script type="text/javascript">
$(document).ready(function () {

var PasswordForm = $("#form0");

var keywordField = $("#0Password");
var serviceField = $("#Service");
var lengthField = $("#Length");
var UpperCaseButton = $("#UpperCase");
var LowerCaseButton = $("#LowerCase");
var NumbersButton = $("#Numbers");
var SpecialCharactersButton = $("#SpecialCharacters");
var RetrieveButton = $("#RetrieveButton");
var ResultField = $("#Result");

var keywordString = "";
var serviceString = "";
var length = 15;
var MakeUpperCase = false;
var MakeLowerCase = false;
var MakeNumbers = false;
var MakeSpecialCharacters = false;

PasswordForm.submit(function (e) {
e.preventDefault();

keywordString = keywordField.val();
serviceString = serviceField.val();
length = +(lengthField.val());
MakeUpperCase = UpperCaseButton.is(":checked");
MakeLowerCase = LowerCaseButton.is(":checked");
MakeNumbers = NumbersButton.is(":checked");
MakeSpecialCharacters = SpecialCharactersButton.is(":checked");

var password = ZeroPassword.compute(keywordString, serviceString, length, MakeUpperCase, MakeLowerCase, MakeNumbers, MakeSpecialCharacters);
ResultField.val(password);
});

});
</script>
</head>

<body>
<h1>0Password</h1>
<p>0Password never remembers your passwords. It keeps your digital life secure and always available, safe behind the one password that only you know. </p>
<h3>0Password never remembers your passwords. It keeps your digital life secure and always available, safe behind
the
zero password that only you know.</h3>

<section>
<form id="form0" action="" method="get" autocomplete="off">
<p class="generator-p">
<span class="generator-block">
Password that only you know (0Password)<br />
<input autofocus="autofocus" id="0Password" name="0Password" tabindex="1" type="password"
autocomplete="off" required /><br />
</span>

</p>
<p class="generator-p">
<span class="generator-block">
Service<br />
<input id="Service" name="Service" tabindex="2" type="text" autocomplete="off" required /><br />
</span>
<span class="description">
Examples: <span>github</span>, <span>facebook</span>, <span>gmail</span>, <span>amazon</span>,
<span>instagram</span>, <span>reddit</span>, or anything else.
</span>
<span class="clearboth"></span>
</p>
<p class="generator-p">
<span class="generator-block">
Length (8-64)<br />
<input id="Length" name="Length" tabindex="3" type="number" value="15" min="8" max="64" required />
<br />

<span class="checkboxes">
<input checked="checked" data-val="true" data-val-required="The UpperCase field is required."
id="UpperCase" name="UpperCase" type="checkbox" value="true" /><input name="UpperCase"
type="hidden" value="false" /> Shouting Letters<br />
<input checked="checked" data-val="true" data-val-required="The LowerCase field is required."
id="LowerCase" name="LowerCase" type="checkbox" value="true" /><input name="LowerCase"
type="hidden" value="false" /> Small Letters<br />
<input checked="checked" data-val="true" data-val-required="The Numbers field is required."
id="Numbers" name="Numbers" type="checkbox" value="true" /><input name="Numbers"
type="hidden" value="false" />
Digits<br />
<input checked="checked" data-val="true"
data-val-required="The SpecialCharacters field is required." id="SpecialCharacters"
name="SpecialCharacters" type="checkbox" value="true" /><input name="SpecialCharacters"
type="hidden" value="false" /> Crazy Symbols<br />
</span>
</span>
</p>
<p class="retrieve-button">
<span class="generator-block">
<input type="submit" id="RetrieveButton" value="Retrieve Password" class="button" tabindex="4" />
</span>
</p>
<p class="generator-p">
<span class="generator-block">
Ta-Da! Your Password<br />
<input id="Result" name="Result" type="text" tabindex="5" value="" autocomplete="off" /><br />
</span>

</p>
</form>
</section>
<footer>
<p>
This page is hosted on GitHub Pages. The source code is available <a
href="https://github.com/0Password/0password.github.io" target="_blank">here</a>.
Your passwords are not stored.
</p>
</footer>
</body>
</html>

</html>
89 changes: 89 additions & 0 deletions js/0Password.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
0Password.js
---------------------
0Password never remembers your passwords.
It keeps your digital life secure and always available,
safe behind the zero password that only you know.
---------------------
https://0password.github.io/
---------------------
by Max Gripe (https://github.com/MaxGripe)
*/

var ZeroPassword = function () {

function getCharFromSet(hash, charSet, index) {
return charSet[hash.charCodeAt(index) % charSet.length];
}

function meetsRequirements(password, upperCase, lowerCase, numbers, specialChars) {
return (!upperCase || /[A-Z]/.test(password)) &&
(!lowerCase || /[a-z]/.test(password)) &&
(!numbers || /[0-9]/.test(password)) &&
(!specialChars || /[!@#$%^&*_\-+:,.?]/.test(password));
}

return {
compute: function (keyword, service, length, upperCase, lowerCase, numbers, specialChars) {
var minLen = 8;
var maxLen = 64;
var upperCaseSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lowerCaseSet = "abcdefghijklmnopqrstuvwxyz";
var numbersSet = "0123456789";
var specialCharSet = "!@#$%^&*_-+:,.?";

var charMap = "";
if (upperCase) charMap += upperCaseSet;
if (lowerCase) charMap += lowerCaseSet;
if (numbers) charMap += numbersSet;
if (specialChars) charMap += specialCharSet;

var password = "";

length = Math.min(Math.max(length, minLen), maxLen);
keyword = keyword || "";
service = service || "";

var baseString = keyword + service +
(upperCase ? "U" : "") +
(lowerCase ? "L" : "") +
(numbers ? "N" : "") +
(specialChars ? "S" : "");
var hash = CryptoJS.SHA256(baseString).toString(CryptoJS.enc.Base64);

var index = 0;

// Ensure at least one character of each required type
var requiredTypes = [
{ active: upperCase, set: upperCaseSet, added: false },
{ active: lowerCase, set: lowerCaseSet, added: false },
{ active: numbers, set: numbersSet, added: false },
{ active: specialChars, set: specialCharSet, added: false }
];

requiredTypes.forEach(function (type) {
if (type.active) {
password += getCharFromSet(hash, type.set, index++);
type.added = true;
}
});

// Fill the rest of the password
while (password.length < length) {
if (index >= hash.length) {
hash = CryptoJS.SHA256(hash).toString(CryptoJS.enc.Base64);
index = 0;
}
var char = charMap[hash.charCodeAt(index++) % charMap.length];
password += char;
}

// Ensure password meets all requirements
if (!meetsRequirements(password, upperCase, lowerCase, numbers, specialChars)) {
return this.compute(keyword, service, length, upperCase, lowerCase, numbers, specialChars);
}

return password.slice(0, length);
}
};
}();
13 changes: 13 additions & 0 deletions js/libs/core-min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions js/libs/enc-base64-min.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
4 changes: 4 additions & 0 deletions js/libs/jquery-1.11.0.min.js

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions js/libs/sha256.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 61842be

Please sign in to comment.