网盘内的隐私照片
好兄弟最近遇到了一个困难:“我之前一直都是把照片存在网盘里面的,但是最近听说了某网盘的照片泄露了,自己的生活照啊,私密照啊都被人看光了,这太可怕了!我现在也很担心自己的网盘上照片泄露,吓得我都不敢用网盘了。能不能帮我想想办法?”
我说,“这很简单啊,那就不要存网盘了嘛,网盘会员一年也有大几百块钱,你去买u盘,自己存储不就好了。“
好兄弟说,”这不行啊,u盘虽然我也有,但是存储容量没有网盘多,用起来也没有网盘方便。比如说,我在任何地方,只需要登陆一下网盘的账户,就可以使用了,不用额外随时携带u盘,又怕丢失,又怕碰坏,所以,我还是需要网盘的。“
好吧,那么本期,我们就帮好兄弟解决一下这个问题。
压缩加密
其实,想要安全的将照片存储到网盘里,只需要额外进行一次文件加密就行了。这样没有密钥的人,就无法使用照片,即使是泄露了,也不能查看和访问。那么,要如何对照片进行加密呢?
最简单的方法,我们只需要将文件压缩,然后在压缩的时候设置密码就可以了。
首先,我们需要前往7zip的官网:https://www.7-zip.org/
选择一个适合我们的软件版本:
然后找到我们要存储的照片,右键点击,选择压缩
在创建压缩包的时候输入密码
最后,当我们访问压缩包中的文件,或者要将压缩包解压缩的时候,就必须先输入密码,才允许使用了
PYTHON加密
加密单一文件
当然,如果你不愿意使用压缩包,而是更喜欢通过python的方式,来对一个文件进行加密,那么也是可以的
我们可以使用cryptography库:pip install cryptography
import os
from 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 hashes
class FileEncryptor:
def __init__(self, password):
self.password = password
self.salt = os.urandom(16)
self.key_length = 32
self.hash_algorithm = hashes.SHA256()
self.iterations = 100000
self.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 Path
class FolderEncryptor:
def __init__(self, encryptor):
self.encryptor = encryptor
def 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_path
encrypted_root.mkdir(parents=True, exist_ok=True)
for file in files:
input_file = Path(root) / file
output_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_path
decrypted_root.mkdir(parents=True, exist_ok=True)
for file in files:
if file.endswith('.enc'):
input_file = Path(root) / file
output_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('要解密的文件目录', '解密以后的文件目录')
现在,我们就可以轻松的加密文件了,之后再把加密过后的文件放入网盘,就不怕泄露了。
结果
好兄弟看完了加密方法以后,非常的开心,他表示,“太好了,有了这个,我就可以放心大胆的在我的网盘里面,存放我的二次元老婆了!”
什么?这小子费尽心思去加密,居然是怕别人看自己的纸片人老婆?这也太没分享精神了吧!我要求他交出一些,但是,他宁死不屈。最后,我求(囚)了他很久,他终于,发了一张据说是他最喜欢的图片。
我满怀欣喜的打开看,结果就看到了这个: