加密上传的文件,把它们存储在你喜欢的任何地方,并把它们流回到未加密的地方

django-encrypted-filefield的Python项目详细描述


加密上传的文件,把它们存储在你喜欢的任何地方,然后流回去 未加密。

< H2>为什么存在< < /H2> >

使用S3这样的产品托管静态文件越来越普遍,但是 有时这些静态文件并不完全适合公众。你可以 把一些个人信息推到s3中,然后任何拥有url的人都会 能够看到它。

当然,url可能很难猜到,但我不是“安全”的粉丝 “通过默默无闻”所以我写这个是为了加密我推到s3的东西。现在,只有 加密的blob是公开的,但是在内部,在 MyPermissionRequiredMixin,图像和文档被神奇地加载 而且是透明的。

怎么样?

EncryptedFileField是django的本机^{tt3}的薄包装。$ 它可以透明地对用户上传的内容进行加密,并通过 现在加密数据到您指定的任何存储引擎。它也 重写.url值以返回对自己视图的引用,这样做 在返回用户的路上为您解密。

所以你可能曾经拥有过这个:

# my_app/models.pyclassMyModel(models.Model):name=models.CharField(max_length=128)attachment=models.FileField(upload_to="attachments")image=models.ImageField(upload_to="images",width_field="image_width",height_field="image_height")image_width=models.PositiveIntegerField()image_height=models.PositiveIntegerField()

您只需更改文件字段,就可以得到加密的文件

# my_app/models.pyfromdjango_encrypted_filefield.fieldsimport(EncryptedFileField,EncryptedImageField)classMyModel(models.Model):name=models.CharField(max_length=128)attachment=EncryptedFileField(upload_to="attachments")image=EncryptedImageField(upload_to="images",width_field="image_width",height_field="image_height")image_width=models.PositiveIntegerField()image_height=models.PositiveIntegerField()# my_app/views.pyfromdjango.contrib.auth.mixinsimportAuthMixinfromdjango_encrypted_filefield.viewsimportFetchViewclassMyPermissionRequiredMixin(AuthMixin)"""
    Your own rules live here
    """passclassMyFetchView(MyPermissionRequiredMixin,FetchView):pass
# my_app/urls.pyfromdjango_encrypted_filefield.constantsimportFETCH_URL_NAMEfrommyapp.viewsimportMyFetchViewurlpatterns=[# ...url(r"^my-fetch-url/(?P<path>.+)",# up to you, but path is requiredMyFetchView.as_view(),# your view, your permissionsname=FETCH_URL_NAME),# ...]

如何配置?

包的配置要求在 环境(推荐)或在您的settings.py中。这些值是:

  • DEFF_SALT:用于生成同步加密的salt值
  • DEFF_PASSWORD:相同内容的密码值
  • DEFF_FETCH_URL_NAME:要用于下载 文件在飞行中被解密。

除此之外,按照上面的步骤,你应该很好地去。

如何运行测试?

由于此项目取决于三个环境变量的设置,因此 为测试设置这些。而且,测试也期望这些值,所以 不要更改它们:

$ DEFF_SALT="salt"DEFF_PASSWORD="password"DEFF_FETCH_URL_NAME="fetch" ./manage.py test

有演示吗?

是的!只要检查代码并在^{tt9}中运行mini django应用程序$ 目录:

$ git clone git@github.com:danielquinn/django-encrypted-filefield.git
$ cd django-encrypted-filefield/demo
$ exportDEFF_SALT="salt"
$ exportDEFF_PASSWORD="password"
$ exportDEFF_FETCH_URL_NAME="fetch"
$ ./manage migrate
$ ./manage.py runserver

…然后打开http://localhost:8000并通过表单提交两个文件。在这个 我们使用django的默认存储,但是同样的逻辑应该适用于 所有存储引擎。

不起作用的东西

由于文件在保存之前发生了更改,因此不能应用验证器 对文件内容起作用的。例如,如果你有一个验证器 使用mime magic确定文件类型时,它将始终返回 text/plain除非你正在检查,否则它会破坏你的 验证。为了使事情更有趣,django似乎应用了 每次保存时验证字段值,而不仅仅是在字段 改变了,所以即使验证器在第一次运行时工作, 如果要更新管理中的对象,则在这种情况下验证器将出现错误。

项目进展如何?

稳定。我现在正在生产环境中积极使用它 一段时间没有问题。这并不能保证它能起作用 每个人在任何情况下,当然,但它足够我使用这个词:—)

但是请注意,目前,这个模块还没有被改编成在django中工作。 2.0+,所以如果您使用它,可以随意发出一个pull请求,允许它 在1.11和2.0+中工作:-)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在服务器启动时,有问题的类告诉我什么?   java将日志记录信息存储到oracle数据库   更新后,java在Windows中还原旧Jenkins作业   考虑到夏令时,java使用iCal4j创建循环   java如何使用Spring和RESTAPI在数据库中上传图像?   在引用java源代码时将Fantom项目编译成jar?   java使用GSON解析不带数组名的JSON字符串   java Eclipse插件功能?   Socket如何在java中创建SocketClosedHandler?   缓存Java是否只更改缓存中修改的字段的值?   java RepositoryException:org。sql2o。Sql2oException:数据库错误:查询未返回任何结果   javaaxis2导致javax。xml。流动XMLStreamException:元素文本内容不能包含开始元素   java In-Play框架,对模型的更改如何以及何时与DB模式同步?   java如何在通过JSTL调用函数时传递参数