草庐IT

python - 在 Django 中安全地存储加密凭证

coder 2023-08-15 原文

我正在开发一个 python/django 应用程序,除其他外,它将数据同步到各种其他服务,包括 samba 共享、ssh(scp) 服务器、Google 应用程序等。因此,它需要存储访问这些服务的凭据。我认为,将它们存储为未加密的字段是一个坏主意,因为 SQL 注入(inject)攻击可以检索凭据。所以我需要在存储之前加密凭证 - 有没有可靠的库来实现这一点?

一旦凭证被加密,就需要在使用前解密。我的应用程序有两个用例:

  • 一种是交互式的——在这种情况下,用户将提供密码来解锁凭据。
  • 另一个是自动同步 - 这是由 cron 作业或类似任务启动的。我应该将密码保存在何处以最大程度地降低此处被利用的风险?

  • 或者我应该采取什么不同的方法来解决这个问题?

    最佳答案

    首先在服务器上存储足以登录多个系统的凭据看起来就像一场噩梦。无论加密方式如何,您服务器上的妥协代码都会泄露它们。

    您应该只存储执行任务所需的凭据(即文件同步)。对于服务器,您应该考虑使用同步服务器,如 RSync ,对于谷歌来说,像 OAuth 这样的协议(protocol)等等。这样,如果您的服务器受到威胁,这只会泄漏数据,而不会泄漏对系统的访问。

    接下来是加密这些凭据。对于密码学,我建议您使用 PYCrypto .

    对于您在密码学中使用的所有随机数,通过 Crypto.Random(或其他一些强大的方法)生成它们,以确保它们足够强大。

    您不应使用相同的 key 加密不同的凭据。我推荐的方法是这样的:

  • 您的服务器应该拥有它的主机密 (源自/dev/random)。将它存储在 root 拥有的文件中,并且只有 root 可以读取。
  • 当您的服务器以 root 权限启动时,它会将文件读入内存,并在为客户端提供服务之前放弃它的权限。这是 Web 服务器和其他恶魔的正常做法。
  • 当您要编写新凭证(或更新现有凭证)时,生成一个随机块 小号 .取前半部分并计算哈希 K=H(S1,M) .那将是您的加密 key 。
  • 使用 CBC 模式加密您的数据。拿 初始化向量(IV)来自 S2 .
  • 店铺 小号 与加密数据一起。

  • 需要解密时取出小号 创建 K 并用相同的IV解密。

    对于哈希,我建议使用 SHA1,对于加密 — AES。散列和对称密码足够快,因此使用更大的 key 大小不会受到伤害。

    这个方案在某些地方有点过头了,但这同样不会受到伤害。

    但请再次记住,存储凭据的最佳方法不是存储凭据,当您必须存储时,请使用允许您完成任务的最低权限的凭据。

    关于python - 在 Django 中安全地存储加密凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904560/

    有关python - 在 Django 中安全地存储加密凭证的更多相关文章

    1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

      我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

    4. ruby - 如何安全地删除文件? - 2

      在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

    5. Python 相当于 Perl/Ruby ||= - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

    6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    7. ruby - Rack:如何将 URL 存储为变量? - 2

      我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

    8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

      华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

    9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

      我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

    10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

      本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

    随机推荐