Skip to main content

A python xxxFile like ( ie GzipFile, BZ2File, ...) for manipulating Tink encrypted files.

Project description

CircleCI codecov PyPI - Downloads

TinkFile

A python xxxFile like (ie TarFile, GzipFile, BZ2File, pyzstd.ZstdFile, ...) for encrypting files with cryptography Tink.

This project is part of the CofferFile : https://github.com/bibi21000/CofferFile

If you're looking for a more powerfull storage for your sensible datas, look at PyCoffer : https://github.com/bibi21000/PyCoffer.

Install

    pip install tinkfile

Create your encryption key in json format

    import tink
    from tink import aead
    from tink import secret_key_access

    aead.register()
    key_template = aead.aead_key_templates.AES128_GCM
    keyset_handle = tink.new_keyset_handle(key_template)
    key = tink.json_proto_keyset_format.serialize(
            keyset_handle, secret_key_access.TOKEN
        )

and store it in a safe place (disk, database, ...).

This key is essential to encrypt and decrypt data. Losing this key means losing the data.

"open" your encrypted files like normal files

Text files :

    import tinkfile

    with tinkfile.open('test.txc', mode='wt', tink_key=key, encoding="utf-8") as ff:
        ff.write(data)

    with tinkfile.open('test.txc', "rt", tink_key=key, encoding="utf-8") as ff:
        data = ff.read()

    with tinkfile.open('test.txc', mode='wt', tink_key=key, encoding="utf-8") as ff:
        ff.writelines(data)

    with tinkfile.open('test.txc', "rt", tink_key=key, encoding="utf-8") as ff:
        data = ff.readlines()

Binary files :

    import tinkfile

    with tinkfile.open('test.dac', mode='wb', tink_key=key) as ff:
        ff.write(data)

    with tinkfile.open('test.dac', "rb", tink_key=key) as ff:
        data = ff.read()

Or compress and crypt them with pyzstd

    pip install tinkfile[zstd]
    from tinkfile.zstd import TinkFile

    with TinkFile('test.dac', mode='wb', tink_key=key) as ff:
        ff.write(data)

    with TinkFile('test.dac', mode='rb', tink_key=key) as ff:
        data = ff.read()

And chain it to tar and bz2

class TarBz2TinkFile(tarfile.TarFile):

    def __init__(self, name, mode='r', tink_key=None, chunk_size=tinkfile.CHUNK_SIZE, **kwargs):
        compresslevel = kwargs.pop('compresslevel', 9)
        self.fernet_file = tinkfile.TinkFile(name, mode,
            tink_key=tink_key, chunk_size=chunk_size, **kwargs)
        try:
            self.bz2_file = bz2.BZ2File(self.fernet_file, mode=mode,
                compresslevel=compresslevel, **kwargs)
            try:
                super().__init__(fileobj=self.bz2_file, mode=mode, **kwargs)

            except Exception:
                self.bz2_file.close()
                raise

        except Exception:
            self.fernet_file.close()
            raise

    def close(self):
        try:
            super().close()
        finally:
            try:
                if self.fernet_file is not None:
                    self.bz2_file.close()
            finally:
                if self.fernet_file is not None:
                    self.fernet_file.close()

    with TarBz2TinkFile('test.zsc', mode='wb', tink_key=key) as ff:
        ff.add(dataf1, 'file1.out')
        ff.add(dataf2, 'file2.out')

    with TarBz2TinkFile('test.zsc', mode='rb', tink_key=key) as ff:
        fdata1 = ff.extractfile('file1.out')
        fdata2 = ff.extractfile('file2.out')

Encrypt / decrypt existing files

Encrypt :

    import tinkfile

    with open(source, 'rb') as fin, tinkfile.open(destination, mode='wb', tink_key=key) as fout:
        while True:
            data = fin.read(7777)
            if not data:
                break
            fout.write(data)

Decrypt :

    import tinkfile

    with tinkfile.open(source, mode='rb', tink_key=key) as fin, open(destination, 'wb') as fout :
        while True:
            data = fin.read(8888)
            if not data:
                break
            fout.write(data)

Or to compress and crypt

    import tinkfile.zstd

    with open(source, 'rb') as fin, tinkfile.zstd.open(destination, mode='wb', tink_key=key) as fout:
        while True:
            data = fin.read(7777)
            if not data:
                break
            fout.write(data)

    with tinkfile.zstd.open(source, mode='rb', tink_key=key) as fin, open(destination, 'wb') as fout :
        while True:
            data = fin.read(8888)
            if not data:
                break
            fout.write(data)

Look at documentation : https://bibi21000.github.io/TinkFile/

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tinkfile-0.0.1.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tinkfile-0.0.1-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

File details

Details for the file tinkfile-0.0.1.tar.gz.

File metadata

  • Download URL: tinkfile-0.0.1.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for tinkfile-0.0.1.tar.gz
Algorithm Hash digest
SHA256 a70fb8114ab390d0f9af48f5d5b41be6d0a2168a091e44e8cef97defc6a6e4d6
MD5 8ee1a09a0bb53cd8c667c88274dcca58
BLAKE2b-256 ae1ad62430cfc73b2a4aa42dc94c3d176d9bc9c56a891550b8ea40a9a765833b

See more details on using hashes here.

File details

Details for the file tinkfile-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: tinkfile-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 8.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for tinkfile-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c3d556c116f013c4405f3bbef3ebda5a278d1ac6928849f500ab9eeaffd6c6e7
MD5 74f2e581b502a4e57b8aab2c8931a029
BLAKE2b-256 b44d3f4386ce4ade827a5882a8c6e7dff5fc19b6ba7dd32b06ca6d180960d44d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page