Add files via upload
parent
9e827831bb
commit
31b523e4cf
|
@ -0,0 +1,36 @@
|
||||||
|
def banner():
|
||||||
|
print('''\033[49m \033[m
|
||||||
|
\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄▄▄▄▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[38;5;14;48;5;14m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49m \033[49;38;5;14m▀\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[48;5;14m \033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀▀▀▀▀▀▀\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;48;5;14m▄\033[49m \033[m
|
||||||
|
\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[38;5;14;48;5;14m▄\033[49m \033[m
|
||||||
|
\033[49m \033[48;5;14m \033[49;38;5;14m▀\033[49m \033[38;5;14;49m▄▄▄▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[48;5;14m \033[38;5;14;49m▄\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[48;5;14m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀▀▀▀\033[48;5;14m \033[49m \033[48;5;14m \033[38;5;14;49m▄\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[49m \033[48;5;14m \033[49m \033[48;5;14m \033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49m \033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[38;5;14;49m▄\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[49m \033[38;5;14;49m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[38;5;14;49m▄▄▄▄▄\033[38;5;14;48;5;14m▄\033[38;5;14;49m▄▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[38;5;14;48;5;14m▄\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀\033[48;5;14m \033[49;38;5;14m▀\033[49m \033[m
|
||||||
|
\033[49m \033[49;38;5;14m▀▀▀▀▀\033[49m \033[m
|
||||||
|
\033[49m \033[m
|
||||||
|
\033[49m \033[m
|
||||||
|
''')
|
||||||
|
print('''
|
||||||
|
_____ _ _ _
|
||||||
|
| __ \\ | | /\\ | | | |
|
||||||
|
| |__) |_ _ ___ _____ _____ _ __ __| | / \\ | | ___| |__ ___ _ __ ___ _ _
|
||||||
|
| ___/ _` / __/ __\\ \\ /\\ / / _ \\| '__/ _` | / /\\ \\ | |/ __| '_ \\ / _ \\ '_ ` _ \\| | | |
|
||||||
|
| | | (_| \\__ \\__ \\\\ V V / (_) | | | (_| |/ ____ \\| | (__| | | | __/ | | | | | |_| |
|
||||||
|
|_| \\__,_|___/___/ \\_/\\_/ \\___/|_| \\__,_/_/ \\_\\_|\\___|_| |_|\\___|_| |_| |_|\\__, |
|
||||||
|
__/ |
|
||||||
|
|___/
|
||||||
|
''')
|
|
@ -0,0 +1,99 @@
|
||||||
|
#imports
|
||||||
|
from sqlalchemy import create_engine, Column, String, Integer
|
||||||
|
from sqlalchemy.orm import sessionmaker, declarative_base
|
||||||
|
from os.path import exists
|
||||||
|
from os import mkdir
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
#sql alchemy base for tables to inherit from
|
||||||
|
Base = declarative_base()
|
||||||
|
|
||||||
|
# Ensure the directory for the database exists
|
||||||
|
if not exists("db"):
|
||||||
|
mkdir("db")
|
||||||
|
|
||||||
|
# Define the Password model
|
||||||
|
class Password(Base):
|
||||||
|
__tablename__ = "Password"
|
||||||
|
domain = Column("domain", String, primary_key=True)
|
||||||
|
ccred = Column("ccred", String)
|
||||||
|
|
||||||
|
def __init__(self, domain, ccred):
|
||||||
|
self.domain = domain
|
||||||
|
self.ccred = ccred
|
||||||
|
|
||||||
|
|
||||||
|
# Database setup
|
||||||
|
engine = create_engine("sqlite:///db/creds.db")
|
||||||
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
|
Session = sessionmaker(bind=engine)
|
||||||
|
|
||||||
|
#manage context
|
||||||
|
@contextmanager
|
||||||
|
def get_session():
|
||||||
|
session = Session()
|
||||||
|
try:
|
||||||
|
yield session
|
||||||
|
session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
session.rollback()
|
||||||
|
print(f"Database error: {e}")
|
||||||
|
finally:
|
||||||
|
session.close()
|
||||||
|
|
||||||
|
#store credential
|
||||||
|
def store(domain,ccred):
|
||||||
|
p = Password(domain,ccred)
|
||||||
|
with get_session() as session:
|
||||||
|
try:
|
||||||
|
session.add(p)
|
||||||
|
return "Stored credential"
|
||||||
|
except Exception as e:
|
||||||
|
return "Error storing password: {e}"
|
||||||
|
|
||||||
|
#load credemtial
|
||||||
|
def fetch(domain):
|
||||||
|
#with context manager
|
||||||
|
with get_session() as session:
|
||||||
|
|
||||||
|
#query passwords by domain
|
||||||
|
p = session.query(Password).filter(Password.domain == domain).first()
|
||||||
|
|
||||||
|
#if one is found
|
||||||
|
if p:
|
||||||
|
return p.ccred
|
||||||
|
|
||||||
|
#error
|
||||||
|
else:
|
||||||
|
return f"No cred found for '{domain}'"
|
||||||
|
def fetchall():
|
||||||
|
#with context manager
|
||||||
|
with get_session() as session:
|
||||||
|
|
||||||
|
#query passwords by domain
|
||||||
|
p = session.query(Password)
|
||||||
|
|
||||||
|
#if one is found
|
||||||
|
if p:
|
||||||
|
return p
|
||||||
|
|
||||||
|
#error
|
||||||
|
else:
|
||||||
|
return "No creds found"
|
||||||
|
#load credemtial
|
||||||
|
def update(domain,ccred):
|
||||||
|
#with context manager
|
||||||
|
with get_session() as session:
|
||||||
|
|
||||||
|
#query passwords by domain
|
||||||
|
p = session.query(Password).filter(Password.domain == domain).first()
|
||||||
|
|
||||||
|
#if one is found
|
||||||
|
if p:
|
||||||
|
p.ccred=ccred
|
||||||
|
return "updated credential"
|
||||||
|
|
||||||
|
#error
|
||||||
|
else:
|
||||||
|
return f"No cred found for '{domain}'"
|
|
@ -0,0 +1,23 @@
|
||||||
|
import argparse
|
||||||
|
def parser():
|
||||||
|
parser = argparse.ArgumentParser(description="passwordalchemy args")
|
||||||
|
subparse=parser.add_subparsers(dest="command")
|
||||||
|
|
||||||
|
fetchparser=subparse.add_parser("fetch")
|
||||||
|
fetchparser.add_argument("-pk","--privatekey",required=True, help="path to private key pem file")
|
||||||
|
fetchparser.add_argument("-d", "--domain",required=True)
|
||||||
|
|
||||||
|
storeparser=subparse.add_parser("store")
|
||||||
|
storeparser.add_argument("-d", "--domain",required=True)
|
||||||
|
storeparser.add_argument("-p", "--password",required=True)
|
||||||
|
|
||||||
|
updateparser=subparse.add_parser("update")
|
||||||
|
updateparser.add_argument("-d", "--domain",required=True)
|
||||||
|
updateparser.add_argument("-p", "--password",required=True)
|
||||||
|
|
||||||
|
gkparser=subparse.add_parser("genkeys")
|
||||||
|
gkparser.add_argument("-pk","--privatekey")
|
||||||
|
gkparser.add_argument("-opk","--oldprivatekey")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
return args
|
|
@ -0,0 +1,83 @@
|
||||||
|
import rsa
|
||||||
|
import base64
|
||||||
|
import lib.db
|
||||||
|
import lib.parse
|
||||||
|
import lib.banner
|
||||||
|
|
||||||
|
class mainfuncs:
|
||||||
|
#generate keyset. first or new
|
||||||
|
@staticmethod
|
||||||
|
def genkeys(args):
|
||||||
|
#generate keypair
|
||||||
|
(pubkey, privkey) = rsa.newkeys(900)
|
||||||
|
#if a key is already present
|
||||||
|
if args.oldprivatekey:
|
||||||
|
with open(args.oldprivatekey,"r") as pemfile:
|
||||||
|
oldprivatekey=rsa.PrivateKey._load_pkcs1_pem(pemfile.read())
|
||||||
|
#save public key
|
||||||
|
with open("pub.pem","w") as pemfile:
|
||||||
|
pemfile.write(pubkey._save_pkcs1_pem().decode("utf-8"))
|
||||||
|
#if path to save in not specified
|
||||||
|
if not args.privatekey:
|
||||||
|
print("save this pem to a secure location to decrypt your passwords. If you lose it you can't recover your credentials")
|
||||||
|
print(privkey._save_pkcs1_pem().decode("utf-8"))
|
||||||
|
print("you can copy and paste it. and leave the prompt blank")
|
||||||
|
args.privatekey=input("or we can save it for you here: ")
|
||||||
|
#save private key
|
||||||
|
with open(args.privatekey,"w") as pemfile:
|
||||||
|
pemfile.write(privkey._save_pkcs1_pem().decode("utf-8"))
|
||||||
|
#if a key is already present
|
||||||
|
if args.oldprivatekey:
|
||||||
|
creds=lib.db.fetchall()
|
||||||
|
#if creds are present
|
||||||
|
if creds:
|
||||||
|
for cred in creds:
|
||||||
|
with open(args.privatekey) as pemfile:
|
||||||
|
privkey=rsa.PrivateKey._load_pkcs1_pem(pemfile.read())
|
||||||
|
pcred=rsa.decrypt(base64.b64decode(cred.ccred),oldprivatekey).decode("utf-8")
|
||||||
|
ccred=base64.b64encode(rsa.encrypt(pcred.encode("utf-8"),pubkey)).decode("utf-8")
|
||||||
|
lib.db.update(cred.domain,ccred)
|
||||||
|
|
||||||
|
#fetch a credential
|
||||||
|
@staticmethod
|
||||||
|
def fetch(args):
|
||||||
|
#send to db library fetch function
|
||||||
|
ccred=lib.db.fetch(args.domain)
|
||||||
|
with open(args.privatekey) as pemfile:
|
||||||
|
#load rsa private key
|
||||||
|
privkey=rsa.PrivateKey._load_pkcs1_pem(pemfile.read())
|
||||||
|
#print credential
|
||||||
|
print(rsa.decrypt(base64.b64decode(ccred),privkey).decode("utf-8"))
|
||||||
|
|
||||||
|
#store a credential
|
||||||
|
@staticmethod
|
||||||
|
def store(args):
|
||||||
|
with open("pub.pem") as pemfile:
|
||||||
|
#load rsa public key
|
||||||
|
pubkey=rsa.PublicKey._load_pkcs1_pem(pemfile.read())
|
||||||
|
#encrypted credential
|
||||||
|
ccred=base64.b64encode(rsa.encrypt(args.password.encode("utf-8"),pubkey)).decode("utf-8")
|
||||||
|
#send to db library store function
|
||||||
|
print(lib.db.store(args.domain,ccred))
|
||||||
|
|
||||||
|
#update a credential
|
||||||
|
@staticmethod
|
||||||
|
def update(args):
|
||||||
|
with open("pub.pem") as pemfile:
|
||||||
|
#load rsa public key
|
||||||
|
pubkey=rsa.PublicKey._load_pkcs1_pem(pemfile.read())
|
||||||
|
#encrypted credential
|
||||||
|
ccred=base64.b64encode(rsa.encrypt(args.password.encode("utf-8"),pubkey)).decode("utf-8")
|
||||||
|
#send to db update store function
|
||||||
|
print(lib.db.update(args.domain,ccred))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
#banner
|
||||||
|
lib.banner.banner()
|
||||||
|
#command line arguments
|
||||||
|
args=lib.parse.parser()
|
||||||
|
#get function name from arguments
|
||||||
|
if args.command:
|
||||||
|
command=getattr(mainfuncs,args.command)
|
||||||
|
#execute
|
||||||
|
command(args)
|
Loading…
Reference in New Issue