草庐IT

python - 基于值组合的安全散列 key

coder 2023-11-07 原文

我在 MongoDB 中有大量记录/文档,我需要通过每个文档列表中的值组合来限制对项目的访问。

想象一下安全的可能的单个值是 [1, 2, 3]。

记录可以是这些的任意组合,即: () (1,) (​​2,) (3,) (1,2) (1,3) (2,3) (1,2,3)

  • 有权访问 [1] 的用户只能看到包含 () & (1) 的记录
  • 有权访问 [2] 的用户只能看到包含 () & (2) 的记录
  • 有权访问 [1, 2] 的用户只能看到具有 (), (1), (2), (1, 2) 的记录
  • 只有可以访问 [1, 2, 3] 的用户才能看到所有记录

现在在数据库的入口点,我知道用户的访问权限是什么,例如 [1, 2, 3]。但我不能轻易地(尤其是索引)查看记录以检索用户有权访问的所有值。

创建一个函数来为每条记录生成唯一的哈希值,这将非常容易:

def hash_combination(input):
    return hash(frozenset(input))

这将为我提供每条记录的唯一键,我们可以将其索引用作过滤器。然后为用户获取所有可能的 key 也很容易:

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))

def hash_powerset(iterable):
    return [hash(frozenset(x)) for x in powerset(iterable)]

但组合的可能唯一输入的实际列表可能非常大(超过 50 个),造成一个太大而不实用的因素。

我只能想到两个可能的解决方案。第一个是逐行检查:

security_list = (1, 2, 3)
for row in db.collection.find():
    # check security
    if any(x not in security_list for x in row['row_security']):
        continue
    # security passed
    pass

但这是一个相当大的性能 killer 。另一种是将选择反转为“我们看不到的”:

unique_list = (1, 2, 3, 4, 5)
security_list = (1, 2, 3)
not_allowed_list = (x for x in unique_list if x not in security_list)
for row in db.collection.find({'row_security': {'$nin': not_allowed_list}}):
    # security passed
    pass

但这也是 mongodb 无法索引的操作(可能是因为与我现在遇到的原因类似),所以仍然不利于性能。比以前的选项更好(因为你避免了转换为 python 对象的瓶颈),但仍然不是很好

我们案例的一些细节:

  • 我们总是知道用户的安全列表
  • 我们总是知道唯一的可能值列表(而且可能很大)
  • python 2.7,mongodb 3.0

还有其他方法吗?解决这个问题的最佳方法是什么?

亲切的问候,

卡斯特

最佳答案

根据 Python Zen,您首先发明了一个干净的解决方案,然后开始优化它如果您确实发现它需要优化.

因此,如您所见,这里实际上有两个任务:1) 制定通用算法,2) 针对特定环境优化算法。


您任务的核心是:

  • 给定:

    • 每条记录都有一组标志 (1,2,3),标记访问它所需的“特权/许可级别”
    • 用户也有一组相同的标志,指定他们的许可级别
  • 问题:

    • 返回用户有权访问的所有记录

既然它是这样表述的,答案就很简单了:

result = {record for record in set_ if user.mask >= record.mask}

现在,对于第二个任务,您需要检查 MongoDB 有效地执行了哪些操作,并弄清楚如何使用它们实现此操作。

关于python - 基于值组合的安全散列 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41634844/

有关python - 基于值组合的安全散列 key的更多相关文章

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

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

  2. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  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

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  5. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  6. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  7. 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?

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

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

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

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

  10. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

随机推荐