Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何创建防黑客攻击的唯一代码_Algorithm - Fatal编程技术网

Algorithm 如何创建防黑客攻击的唯一代码

Algorithm 如何创建防黑客攻击的唯一代码,algorithm,Algorithm,我正在创建一系列独特的代码,以便开展促销活动。 这项活动将为总共2000万件独特物品而开展。守则的有效期为一年。我目前正在寻找最好的选择。 我只能在代码中使用0-9和A-Z。因此,我只能在代码中使用36个唯一字符。最终用户需要在系统中输入唯一的cd并获得优惠。唯一代码不会与任何用户或事务绑定 生成唯一代码的一种方法是创建增量数字,然后将其转换为base36以获得唯一的cd。问题是它很容易被破解。用户可以开始以增量方式插入unqiue cd,并兑换不适合他们的优惠。我正在考虑引入某种随机化。需要关

我正在创建一系列独特的代码,以便开展促销活动。 这项活动将为总共2000万件独特物品而开展。守则的有效期为一年。我目前正在寻找最好的选择。
我只能在代码中使用0-9和A-Z。因此,我只能在代码中使用36个唯一字符。最终用户需要在系统中输入唯一的cd并获得优惠。唯一代码不会与任何用户或事务绑定

生成唯一代码的一种方法是创建增量数字,然后将其转换为base36以获得唯一的cd。问题是它很容易被破解。用户可以开始以增量方式插入unqiue cd,并兑换不适合他们的优惠。我正在考虑引入某种随机化。需要关于同样的建议


注意-代码中的最大字符数限制为8

使用加密强随机数生成器生成40位数字(即5字节随机数组序列)。将每个数组转换为base-36将产生一个随机的八字符代码序列。对每个代码运行额外的检查,以确保没有重复的代码。对转换后的字符串使用哈希集可以让您在合理的时间内执行此任务

以下是Java中的一个示例实现:

Set<String> codes = new HashSet<>();
SecureRandom rng = new SecureRandom();
byte[] data = new byte[5];
for (int i = 0 ; i != 100000 ; i++) {
    rng.nextBytes(data);
    long val = ((long)(data[0] & 0xFF))
    | (((long)(data[1] & 0xFF)) << 8)
    | (((long)(data[2] & 0xFF)) << 16)
    | (((long)(data[3] & 0xFF)) << 24)
    | (((long)(data[4] & 0xFF)) << 32);
    String s = Long.toString(val, 36);
    codes.add(s);
}
System.out.println("Generated "+codes.size()+" codes.");
Set code=new HashSet();
SecureRandom rng=新的SecureRandom();
字节[]数据=新字节[5];
对于(int i=0;i!=100000;i++){
下一个字节(数据);
long val=((long)(数据[0]&0xFF))

|((长)(数据[1]&0xFF))使用加密强随机数生成器生成40位数字(即5字节随机数组序列)。将每个数组转换为base-36将产生一个随机的8个字符的代码序列。对每个代码运行额外的检查,以确保没有重复的代码。对转换后的字符串使用哈希集可以让您在合理的时间内执行此任务

以下是Java中的一个示例实现:

Set<String> codes = new HashSet<>();
SecureRandom rng = new SecureRandom();
byte[] data = new byte[5];
for (int i = 0 ; i != 100000 ; i++) {
    rng.nextBytes(data);
    long val = ((long)(data[0] & 0xFF))
    | (((long)(data[1] & 0xFF)) << 8)
    | (((long)(data[2] & 0xFF)) << 16)
    | (((long)(data[3] & 0xFF)) << 24)
    | (((long)(data[4] & 0xFF)) << 32);
    String s = Long.toString(val, 36);
    codes.add(s);
}
System.out.println("Generated "+codes.size()+" codes.");
Set code=new HashSet();
SecureRandom rng=新的SecureRandom();
字节[]数据=新字节[5];
对于(int i=0;i!=100000;i++){
下一个字节(数据);
long val=((long)(数据[0]&0xFF))
|((长)(数据[1]&0xFF))使用Guid(C代码):

string code=Guid.NewGuid().ToString().Substring(0,8).ToUpperInvariant();
因为我们有一个十六进制表示,我们得到数字和字符
a
f
。我们得到16^8个可能的代码,即>40亿个代码。每214个字符中就有一个表示2000万个代码

Guid.NewGuid().ToString()
生成一个类似于
的字符串“6b984c2f-5866-4745-ac34-d5088a56070f”
。由于第一个组的长度为8个字符,我们只需将前8个字符转换为大写。结果类似于
“6b984c2f”

请注意,这可能会产生重复的代码。我们可以这样避免:

var code=newhashset();
而(代码计数<20000000){
字符串代码=Guid.NewGuid().ToString().Substring(0,8).ToUpperInvariant();
代码。添加(代码);
}
HashSet允许您多次添加项,但始终只保留其中一项。(与数学集一样。)


如果你想使用所有可能的值,上面的一行就不行了。整个字母加上数字,我们得到36^8=~2.8*10^12个可能的代码。每141055个就有一个可能的代码用于2000万个代码。这更好,但仍然不能完全防止黑客攻击。你需要限制尝试进入的次数,使用等等

const string Base=“0123456789abcdefghijklmnopqrstuvxyz”;
常数int码长=8;
单位代码常数=20000000;
var random=新的random();
var code=新的HashSet();
var chars=新字符[代码长度];
while(codes.Count
使用Guid(C代码):

string code=Guid.NewGuid().ToString().Substring(0,8).ToUpperInvariant();
因为我们有一个十六进制表示,我们得到数字和字符
a
f
。我们得到16^8个可能的代码,即>40亿个代码。每214个字符中就有一个表示2000万个代码

Guid.NewGuid().ToString()
生成一个类似于
的字符串“6b984c2f-5866-4745-ac34-d5088a56070f”
。由于第一个组的长度为8个字符,我们只需将前8个字符转换为大写。结果类似于
“6b984c2f”

请注意,这可能会产生重复的代码。我们可以这样避免:

var code=newhashset();
而(代码计数<20000000){
字符串代码=Guid.NewGuid().ToString().Substring(0,8).ToUpperInvariant();
代码。添加(代码);
}
HashSet允许您多次添加项,但始终只保留其中一项。(与数学集一样。)


如果你想使用所有可能的值,上面的一行就不行了。整个字母加上数字,我们得到36^8=~2.8*10^12个可能的代码。每141055个就有一个可能的代码用于2000万个代码。这更好,但仍然不能完全防止黑客攻击。你需要限制尝试进入的次数,使用等等

const string Base=“0123456789abcdefghijklmnopqrstuvxyz”;
常数int码长=8;
单位代码常数=20000000;
var random=新的random();
var code=新的HashSet();
var chars=新字符[代码长度];
while(codes.Count
使用散列函数从顺序输入生成唯一的代码。我在自己的工作中广泛使用了
crc32
,但还有许多其他函数可能会