gpt4 book ai didi

algorithm - 根据输入数字生成随 secret 钥

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:03 26 4
gpt4 key购买 nike

我有一个整数列表(员工 ID)它们都是8位长(虽然几乎都是00开头,但实际上都是8位长)

我需要为每个员工生成一个 key :

- 5 chars including [A-Z][a-z][0-9]
- Must include 1 of [A-Z]
- Must include 1 of [0-9]
- Generated key must be unique
- If I know an employees ID I should not be able to determine their key

我需要生成一个算法来生成 key ,但我想尽可能避免为员工记录 key 。越想越遇到问题。

如果我能避免的话,我不想生成所有的 key 并将它们存储在某个地方——我宁愿它们是动态计算的

我被允许在我的系统中隐藏一个 secret ,除非你知道这个 secret ,否则我可以用它来确保 key 是不确定的。

我考虑过使用标准哈希算法(加盐),但目标空间的限制以及包含 1 个 A-Z 和 1 个 0-9 的限制似乎阻止了这一点。

我认为我可以用来解决问题的一种方法:

1. Build a deteremnistic function that maps integers starting from 1 [1, 2, 3, ...] to every possible result value
2. Map integers [1, 2, ...] to random other integers in the desired range [324, 43565, ...] in a way that preserves uniqueness (based on a secret salt which if changed would result in a different order).

这将保证唯一性,但第 1 步很棘手。结果集是不连续的,某些值可能缺少大写字母,而其他值可能缺少数字。

我可以通过以 A1 开头的每个代码来解决这个问题,这在技术上是可行的,但将结果空间从 5 个字符减少到 3 个字符。

任何人都可以提出一些简单的方法来避免我必须记录所有生成的结果以进行唯一检查吗?

最佳答案

正如 Ralf 所提到的,实现所需的按键变化量的最简单方法可能是改变大写字母和数字的位置,从而得到 2 * 26 * 10 * 62 * 62 * 62>120000000 可能的组合。

为了使 key 不能直接从员工 ID 派生,我建议使用另一个 8 位 secret 数字进行简单的 XOR。然后使用一个简单的模数,然后对每个字符进行除法。

char = x % 62
x = (x - (x % 62)) / 62

例如在 javascript 中:

function ID2Key(id, secret) {
var table = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
var key = new Array(5); // Initialize the key
// Changed XOR to a ROT10
// var scrambled = id ^ secret; // "Encrypt" the employee ID with a secret
var scrambled = 0;
while (id) {
var rotated = ((id % 10) + (secret % 10)) % 10;
scrambled = (scrambled * 10) + rotated;
id = Math.floor(id / 10);
secret = Math.floor(secret / 10)
}

var capital_index = scrambled % 2; // Determine if the Capital letter should be first
scrambled = (scrambled - capital_index) / 2;
var capital = table[36 + (scrambled % 26)]; // Find the capital letter
key[capital_index] = capital;
scrambled = (scrambled - (scrambled % 26)) / 26;

var num = scrambled % 10; // Find the number
key[1-capital_index] = table[num]; // If the capital letter is first place the number second and visa versa
scrambled = (scrambled - (scrambled % 10)) / 10;

// Find the remaining 3 characters
key[2] = table[scrambled % 62];
scrambled = (scrambled - (scrambled % 62)) / 62;

key[3] = table[scrambled % 62];
scrambled = (scrambled - (scrambled % 62)) / 62;

key[4] = table[scrambled % 62];
return key.join("");
}

现场演示 JS Bin

Edit Addressing XOR Failures - 为了解决评论中提出的失败案例,我更改了将 ID 加扰为基于 secret 的循环的方法,现在 secret 也可以是 8 位数字。

Edit Clarifying vulnerabilities - 由于我现在对要求有了更好的理解,主要是员工会知道他们的 ID 和 key ,所以我应该澄清一些密码学概念。鉴于相当小的输入范围和限制性输出,没有可能使 key 加密安全的方法。即使使用像 128 位 AES 这样完善的加密算法,生成的强度也不会比最多 100000000 次暴力破解尝试好多少,这对计算来说是微不足道的。考虑到这一点,获得某种程度的安全性的唯一方法是 secret 算法保持 secret 。在那种情况下,尝试从 ID 和 key 中导出 secret 的人无法知道它们是正确的,除非他们可以访问多个 ID- key 对。

关于algorithm - 根据输入数字生成随 secret 钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757569/

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