【问题标题】:Django encryption key integrityDjango 加密密钥完整性
【发布时间】:2015-01-31 04:42:11
【问题描述】:

我正在实现一个 Django 网站,其中上传的文件在保存到服务器 (/media) 之前使用用户提供的密钥进行加密。当用户希望查看它们时,系统会提示他们输入密钥,加密文件被解密,然后显示给他们。这是我的加密/解密文件代码:

from Crypto import Random 
from Crypto.Cipher import AES
from Crypto.Hash import SHA256


def encryption_pad(string):
    pad = b"\0" * (AES.block_size - len(string) % AES.block_size) 
    padded_string = string + pad
    return padded_string

def encrypt_file(key, file):
    with open(file, 'rb') as out:
        byte_output = out.read()

    hash = SHA256.new()
    hash.update(key)

    byte_output = encryption_pad(byte_output)       
    initialization_vector = Random.new().read(AES.block_size)
    cipher = AES.new(hash.digest(), AES.MODE_CBC, initialization_vector)
    encrypted_output = initialization_vector + cipher.encrypt(byte_output)

    with open(file + ".enc", 'wb') as out:
        out.write(encrypted_output) 

def decrypt_file(file, key):
    with open(file, 'rb') as input:
        ciphertext = input.read()

    hash = SHA256.new()
    hash.update(key)

    initialization_vector = ciphertext[:AES.block_size]
    cipher = AES.new(hash.digest(), AES.MODE_CBC, initialization_vector)
    decrypted_output = cipher.decrypt(ciphertext[AES.block_size:])
    decrypted_output = decrypted_output.rstrip(b"\0")

    with open(file[:-4], 'wb') as output:
        output.write(decrypted_output)

我对安全性比较陌生,所以我的问题是:对于这个设置,密钥必须在服务器的内存中存在一段时间,那么我的 views.py 函数将它们传递给这个模块的正确方法是什么然后妥善处理?

【问题讨论】:

    标签: python django security encryption


    【解决方案1】:

    关于如何在 Python 中安全处理(或不处理)内存中的对象存在一些问题:请参阅 herehere

    但是,如果安全性如此重要,您可能需要考虑一个更安全的选择:在客户端上使用 Javascript 进行加密和解密。这样,密钥永远不会通过网络发送,并且永远不会存在于服务器上。例如,LastPass 就是这样工作的。

    【讨论】:

    • 感谢解释和参考,大有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2011-04-09
    • 2015-09-21
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多