Python POST-REDIRECT-GET使用解密流而不是html文档

Python POST-REDIRECT-GET使用解密流而不是html文档,python,django,encryption,django-views,Python,Django,Encryption,Django Views,我正在使用磁盘加密来保护一些客户端数据。登录后,用户必须提供另一个对称密钥才能从磁盘解密文件: from django.shortcuts import render_to_response, RequestContext from django.contrib.auth.decorators import login_required from django.http import HttpResponse from django.conf import settings from djan

我正在使用磁盘加密来保护一些客户端数据。登录后,用户必须提供另一个对称密钥才能从磁盘解密文件:

from django.shortcuts import render_to_response, RequestContext
from django.contrib.auth.decorators import login_required

from django.http import HttpResponse
from django.conf import settings
from django.template import Template
from my_lib import decrypt_file
import os
import magic

@login_required
def secret_stuff(request):
    if not request.method == 'POST':
        return render_to_response('reenter_key.html', context_instance=RequestContext(request))

    password = request.POST.get('symmetric_key')
    encrypted_file = os.path.join(settings.BASE_DIR, 'templates', 'secret.enc')
    byte_string = decrypt_file(password, encrypted_file)
    file_type = magic.from_buffer(byte_string)
    if b'data' in file_type:
        return render_to_response('bad_key.html', context_instance=RequestContext(request))

     decrypted = Template(byte_string)
     return HttpResponse(decrypted.render(RequestContext(request)))

这种设计对于用户来说很烦人,因为页面重新加载是post请求。如果不将解密后的文件保存到磁盘上,如何避免这种情况发生?

您的意思是要避免每次用户访问数据时强制用户重新输入密钥

这意味着您必须将密钥保存在可由多个进程访问的位置。在Django中保存每个用户数据的常用方法是使用。问题是,您不希望密钥比解密文件更容易访问(因此可能不在数据库或磁盘中)

您可以将用于会话(或者,如果您已经将会话用于其他内容,则跳过会话并手动缓存它)。不过,如文档中所述,本地内存缓存是不合适的

您可以使用memcached或redis,当然,任何有权访问缓存的人都会容易受到密钥的攻击。如果缓存引擎在一个单独的外部服务器上运行,那么您必须担心通过网络发送密钥(尽管也可能使用SSL)

最后,在安全性和用户的便利性之间需要进行权衡,因此您必须确定您担心的攻击向量以及足够好的安全程度