基于值组合的安全散列密钥

2024-04-24 10:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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))

这将为每个记录提供一个唯一的键,我们可以将其作为筛选器使用。为用户获取所有可能的密钥也很容易:

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

但这是一个性能杀手。另一种是将选择反转为“我们看不见的东西”:

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

还有其他方法吗?最好的方法是什么?你知道吗

谨致问候

岩溶


Tags: 用户in列表forreturndef记录not
1条回答
网友
1楼 · 发布于 2024-04-24 10:46:03

根据Python-Zen,你首先发明一个干净的解决方案,然后如果你真的发现它需要优化,就开始优化它。你知道吗

因此,正如你所看到的,这里实际上有两个任务:1)制定一个通用算法,2)针对特定环境优化算法。你知道吗


您任务的核心是:

  • 给出:

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

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

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

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

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

相关问题 更多 >