我正在使用磁盘加密来保护一些客户端数据。登录后,用户必须提供另一个对称密钥才能从磁盘解密文件:
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)))
这种设计对用户来说很烦人,因为页面重新加载是后期请求。如何在不将解密文件保存到磁盘的情况下避免这种情况?
答案 0 :(得分:2)
您是否想要避免在每次访问数据时强制用户重新输入密钥?
这意味着您必须将密钥保存在多个进程可以访问的位置。在Django中保存每用户数据的常用方法是使用sessions framework。问题是你不希望密钥比解密文件更容易访问(因此可能不在数据库或磁盘上)。
您可以使用cache backend进行会话(或者只是跳过会话并手动缓存它,如果您已经使用会话进行其他操作)。但是,如文档中所述,本地内存缓存不合适。
您可以使用memcached或redis,但当然密钥将容易受到任何有权访问缓存的人的攻击。如果缓存引擎在单独的外部服务器上运行,您必须担心通过网络发送密钥(尽管也可能使用SSL)。
最后,在安全性和用户的便利性之间进行权衡,因此您必须确定您担心的攻击媒介以及安全性的程度。够了。