我有一个包含用户的MySQL数据库。每一行都有一个唯一的自动增量ID (1,2,3...)。现在,我需要将其转换为一个唯一的随机序列号,我可以将其转换回ID -所有这些都使用PHP。
用户ID从1到99999999999 (INT(11))。
所有序列号都应至少包含9位数字,并且不能以0开头。用户应该不容易弄清楚如何猜测一个有效的序列号。
感谢:)
发布于 2012-03-08 21:10:35
你可以做一些简单的“加密”。以一个(‘秘密’)素数p 27407和base 17为例。计算基模p-1,12897的乘法逆inv。wolframalpha可以为您做到这一点。
Id到序列号
serial = id^base mod p
serial = 42^17 % 27407 = 24978串行到id
id = serial^inv mod p
id = 24978^12897 % 27407 = 42这可以通过exponentiation bysquaring快速计算出来。只能使用0到27407之间的ids (如果不能使用更大的质数),并且所有ids都有一个唯一的可逆序列号。
要增加模糊度,可以将结果与某个值进行XOR运算。
这不是真正的密码学,只是愚蠢的security through obscurity,但大多数人要花相当大的力气才能破解。
发布于 2012-03-08 19:01:31
最简单的答案是使用哈希函数,并将秘密盐用作密钥
$secretKey = 'oh no nobody will guess this';
$userId = 312;
$serialNumber = hash('sha256', $secretKey . $userId);当然,散列是单向的,因此您还必须将序列号存储在DB中,因为您不能根据给定的序列号计算ID。
发布于 2012-03-08 19:06:28
我不会建议你做你想做的事情。
你看,autoincrement通常是用来表示的,以不断避免冗余数据,同时仍然保持的可读性。
因此,请更新您的数据库结构以存储散列。其结构可能类似于id、hash、name等。
在散列中,您可以使用任何逻辑
$hash = sha1("secretanswer".$userid);
$trimmedhash = substr($has,0,9); //get a 9 digit random hash哈希是一种单向加密,这也是有原因的。无论如何,为了验证散列,您可以再次执行相同的算法
$userid = "getthissomehow";
$hash = sha1("secretanswer".$userid);
$trimmedhash = substr($has,0,9);
$prevhash = "asfaf23rfs"; //get previously stored hash somehow
if($trimmedhash == $prevhash) {
//valid
}https://stackoverflow.com/questions/9616561
复制相似问题