implemented derived passwords

This commit is contained in:
shim_ 2018-07-21 14:02:15 +02:00
parent 0c803ba912
commit ecc1cc667b
3 changed files with 57 additions and 10 deletions

View File

@ -9,13 +9,12 @@ import os, struct, time, hashlib, hashlib, random, binascii
class EncryptedScreenshot: class EncryptedScreenshot:
def __init__(self, metadata,id=None,signer=None,password_encryptor=None): def __init__(self, metadata,password=None,id=None,signer=None,password_encryptor=None):
def rand(len): def rand(len):
return ''.join( return ''.join(
random.choice("1234567890ABCDEFGHIJKLMNOPQRSTUWVXYZabcdefghijklmnopqrstuwvxyz") for _ in range(len)) random.choice("1234567890ABCDEFGHIJKLMNOPQRSTUWVXYZabcdefghijklmnopqrstuwvxyz") for _ in range(len))
self.password = rand(16) self.password = (password or rand(16))
print("Passphrase %s" % binascii.hexlify(self.passphrase()))
self.id = id self.id = id
if id is None: if id is None:
self.id = rand(8) self.id = rand(8)
@ -60,7 +59,8 @@ class EncryptedScreenshot:
fields = { fields = {
"image": encrypted_image, "image": encrypted_image,
"metadata_encryption": self.metadata_encryption, "metadata_encryption": self.metadata_encryption,
"metadata": encrypted_metadata if self.metadata_encryption else self.metadata "metadata": encrypted_metadata if self.metadata_encryption else self.metadata,
"public_metadata": self.metadata["public"]
} }
if self.signer is not None: if self.signer is not None:

30
imports/hashderive.py Normal file
View File

@ -0,0 +1,30 @@
import hashlib
import binascii
class HashDerivedKey:
@staticmethod
def from_hex(hex_str):
return HashDerivedKey(bytes(bytearray.fromhex(hex_str)))
def __init__(self, master):
def ensure_bytes(b):
assert isinstance(b, bytes)
return b
ensure_bytes(master)
def derive(seed):
ensure_bytes(seed)
sha = hashlib.sha256()
sha.update(master)
sha.update(seed)
return sha.digest()
hex = lambda b: binascii.hexlify(b).decode("utf-8")
self.master = master
self.master_hex = lambda: hex(master)
self.derive = derive
self.derive_hex = lambda seed: hex(derive(seed))
def derive_metadata(self,seed):
key = self.derive(seed)
return (key,{"key_seed": binascii.hexlify(seed).decode("utf-8")})

View File

@ -1,7 +1,8 @@
import time import time
from encryptedscreenshot import EncryptedScreenshot, Signer from encryptedscreenshot import EncryptedScreenshot, Signer
import getpass, os from hashderive import HashDerivedKey
import getpass, os, sys
from PythonQt.QtGui import QInputDialog from PythonQt.QtGui import QInputDialog
from PythonQt.QtCore import QSettings from PythonQt.QtCore import QSettings
from seafapi import * from seafapi import *
@ -36,13 +37,17 @@ class EncryptedProcessor(Processor):
def __init__(self,seaf_lib,lib_path): def __init__(self,seaf_lib,lib_path):
self.seaf_lib = seaf_lib self.seaf_lib = seaf_lib
self.lib_path = lib_path self.lib_path = lib_path
self.host = None
self.derived_key = HashDerivedKey(os.urandom(32))
self.load_settings() self.load_settings()
def load_settings(self): def load_settings(self):
settings = QSettings() settings = QSettings()
settings.beginGroup("uploaders") settings.beginGroup("uploaders")
settings.beginGroup("seafile") settings.beginGroup("seafile")
self.host = settings.value("encscreen-url", "") self.host = settings.value("encscreen-url", None)
if settings.value("encscreen-derived-key", None):
self.derived_key = HashDerivedKey.from_hex(settings.value("encscreen-derived-key", None))
settings.endGroup() settings.endGroup()
settings.endGroup() settings.endGroup()
@ -51,6 +56,7 @@ class EncryptedProcessor(Processor):
settings.beginGroup("uploaders") settings.beginGroup("uploaders")
settings.beginGroup("seafile") settings.beginGroup("seafile")
settings.setValue("encscreen-url", self.host) settings.setValue("encscreen-url", self.host)
if self.derived_key: settings.setValue(self.derived_key.master_hex())
settings.endGroup() settings.endGroup()
settings.endGroup() settings.endGroup()
@ -58,17 +64,28 @@ class EncryptedProcessor(Processor):
return self.host is not None and self.host != "" return self.host is not None and self.host != ""
def configure(self,parent): def configure(self,parent):
self.host = QInputDialog.getText(parent, 'Encscreen Server Setup', 'Enter server url (ex. https://servertld/s#%id%key):', text="https://screens.shimun.net/s#%id%key") self.host = QInputDialog.getText(parent, 'Encscreen Server Setup', 'Enter server url (ex. https://servertld/s#%id%key):', text=(self.host or "https://screens.shimun.net/s#%id%key"))
master = QInputDialog.getText(parent, 'Encscreen Master Key Setup', 'Enter master key (hex encoded):', text=(self.derived_key.master_hex() if self.derived_key else "<random>"))
try:
self.derived_key = HashDerivedKey.from_hex(master)
except:
self.derived_key = HashDerivedKey(os.urandom(32))
self.save_settings() self.save_settings()
def upload(self,file,name): def upload(self,file,name):
enrypted = EncryptedScreenshot({ def derive():
seed = os.urandom(16)
(_, key_meta) = self.derived_key.derive_metadata(seed)
return (self.derived_key.derive_hex(seed)[0:16], key_meta)
(key, key_meta) = derive()
enrypted = EncryptedScreenshot(metadata = {
"owner": getpass.getuser(), "owner": getpass.getuser(),
"format": str(file).split('.')[-1], "format": str(file).split('.')[-1],
"title": name, "title": name,
"timestamp": int(time.time() * 1000), "timestamp": int(time.time() * 1000),
"size": os.stat(file).st_size "size": os.stat(file).st_size,
},signer=Signer.default()) "public": key_meta
},password=key,signer=Signer.default())
tmpHandle = open(file + "c", 'wb') tmpHandle = open(file + "c", 'wb')
tmpHandle.write(enrypted.assemble(file)) tmpHandle.write(enrypted.assemble(file))
tmpHandle.close() tmpHandle.close()