网盘内的隐私照片
好兄弟最近遇到了一个困难:“我之前一直都是把照片存在网盘里面的,但是最近听说了某网盘的照片泄露了,自己的生活照啊,私密照啊都被人看光了,这太可怕了!我现在也很担心自己的网盘上照片泄露,吓得我都不敢用网盘了。能不能帮我想想办法?”
我说,“这很简单啊,那就不要存网盘了嘛,网盘会员一年也有大几百块钱,你去买u盘,自己存储不就好了。“
好兄弟说,”这不行啊,u盘虽然我也有,但是存储容量没有网盘多,用起来也没有网盘方便。比如说,我在任何地方,只需要登陆一下网盘的账户,就可以使用了,不用额外随时携带u盘,又怕丢失,又怕碰坏,所以,我还是需要网盘的。“
好吧,那么本期,我们就帮好兄弟解决一下这个问题。
压缩加密
其实,想要安全的将照片存储到网盘里,只需要额外进行一次文件加密就行了。这样没有密钥的人,就无法使用照片,即使是泄露了,也不能查看和访问。那么,要如何对照片进行加密呢?
最简单的方法,我们只需要将文件压缩,然后在压缩的时候设置密码就可以了。
首先,我们需要前往7zip的官网:https://www.7-zip.org/
选择一个适合我们的软件版本:
然后找到我们要存储的照片,右键点击,选择压缩
在创建压缩包的时候输入密码
最后,当我们访问压缩包中的文件,或者要将压缩包解压缩的时候,就必须先输入密码,才允许使用了
PYTHON加密
加密单一文件
当然,如果你不愿意使用压缩包,而是更喜欢通过python的方式,来对一个文件进行加密,那么也是可以的
我们可以使用cryptography库:pip install cryptography
import osfrom cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashesclass FileEncryptor:def __init__(self, password):self.password = passwordself.salt = os.urandom(16)self.key_length = 32self.hash_algorithm = hashes.SHA256()self.iterations = 100000self.key = self.generate_key()def generate_key(self):kdf = PBKDF2HMAC(algorithm=self.hash_algorithm,length=self.key_length,salt=self.salt,iterations=self.iterations)return kdf.derive(self.password)def encrypt_file(self, input_file, output_file):iv = os.urandom(16)cipher = Cipher(algorithms.AES(self.key), modes.CBC(iv))encryptor = cipher.encryptor()padder = padding.PKCS7(algorithms.AES.block_size).padder()with open(input_file, 'rb') as f:plaintext = f.read()padded_data = padder.update(plaintext) + padder.finalize()ciphertext = encryptor.update(padded_data) + encryptor.finalize()with open(output_file, 'wb') as f:f.write(iv + ciphertext)def decrypt_file(self, input_file, output_file):with open(input_file, 'rb') as f:iv = f.read(16)ciphertext = f.read()cipher = Cipher(algorithms.AES(self.key), modes.CBC(iv))decryptor = cipher.decryptor()padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize()unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()plaintext = unpadder.update(padded_plaintext) + unpadder.finalize()with open(output_file, 'wb') as f:f.write(plaintext)if __name__ == '__main__':password = b'your_secret_password'encryptor = FileEncryptor(password)# 加密文件encryptor.encrypt_file('1.png', '1.png.bin')# 解密文件encryptor.decrypt_file('1.png.bin', '1-decrypt.png')
此时,如果使用encrypt_file,加密文件,加密文件是无法直接看懂的,只有使用decrypt_file解密以后,才能正常访问
遍历加密整个文件目录
刚刚的程序,只能加密单一的文件,如果我有一整个文件夹的文件都需要加密,一个个加密真是太麻烦了,所以,我们还需要提供对整个文件夹进行加密的支持。
import os
from pathlib import Pathclass FolderEncryptor:def __init__(self, encryptor):self.encryptor = encryptordef encrypt_folder(self, input_folder, output_folder):input_folder = Path(input_folder)output_folder = Path(output_folder)for root, dirs, files in os.walk(input_folder):rel_path = Path(root).relative_to(input_folder)encrypted_root = output_folder / rel_pathencrypted_root.mkdir(parents=True, exist_ok=True)for file in files:input_file = Path(root) / fileoutput_file = encrypted_root / f"{file}.enc"self.encryptor.encrypt_file(input_file, output_file)def decrypt_folder(self, input_folder, output_folder):input_folder = Path(input_folder)output_folder = Path(output_folder)for root, dirs, files in os.walk(input_folder):rel_path = Path(root).relative_to(input_folder)decrypted_root = output_folder / rel_pathdecrypted_root.mkdir(parents=True, exist_ok=True)for file in files:if file.endswith('.enc'):input_file = Path(root) / fileoutput_file = decrypted_root / file[:-4]self.encryptor.decrypt_file(input_file, output_file)if __name__ == '__main__':password = b'your_secret_password'encryptor = FileEncryptor(password)folder_encryptor = FolderEncryptor(encryptor)# 加密文件夹folder_encryptor.encrypt_folder('要加密的文件目录', '加密以后的文件目录')# 解密文件夹folder_encryptor.decrypt_folder('要解密的文件目录', '解密以后的文件目录')
现在,我们就可以轻松的加密文件了,之后再把加密过后的文件放入网盘,就不怕泄露了。
结果
好兄弟看完了加密方法以后,非常的开心,他表示,“太好了,有了这个,我就可以放心大胆的在我的网盘里面,存放我的二次元老婆了!”
什么?这小子费尽心思去加密,居然是怕别人看自己的纸片人老婆?这也太没分享精神了吧!我要求他交出一些,但是,他宁死不屈。最后,我求(囚)了他很久,他终于,发了一张据说是他最喜欢的图片。
我满怀欣喜的打开看,结果就看到了这个: