gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:50:23 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com