根据电话号码生成唯一的PIN码
本文关键字:PIN 唯一 电话号码 | 更新日期: 2023-09-27 18:11:55
对于唯一的电话号码,如0241194000
,我想根据电话号码生成一个PIN码,并且还想检查或验证PIN码是否真的是从电话号码生成的。
Number : 0241194000 LENGHT(10)
PIN : 675436 LENGHT(6) ONLY NUMERIC
Checker : 673AA3738SHZXCVDER ANY LENGTH ALPHANUMERIC.
任何链接或帮助将是伟大的。
你正在寻找一个数学的双射函数(最好是一个复杂的)允许任何数字(x)转换为PIN,通过上述功能
F(Number) = PIN
通过有一个双射函数,你可以通过反方向解方程来验证pin。
http://en.wikipedia.org/wiki/Bijection 例如:给定函数:F(Number) = Number*2
function GeneratePIN(Number)
return Number*2
end
function validatePIN(PIN,Number)
return PIN == Number*2
end
尽管上面正确的评论,你不能创造一个独特的针,短于其来源(它可以归结为哈希,这是通过定义没有独特的),我猜你的意思是"不能复制电话号码的代码通过一个局外人,而且,考虑到电话号码和密码,可以证明是相关的,而接受相同的针也可以有效使用另一个电话号码"。
假设,最简单的解决方案是从电话号码创建一个加盐哈希。样本的伪代码:
static uniqueHash = '9t45uufg92dit093ik,96igm0v9m6i09im09i309disl54923';
function createPinFromPhone(string phonenumber)
{
string pin = '';
do {
hash = md5(phonenumber+uniqueHash);
pin += extractNumbersFromString(hash);
phonenumber = pin+hash;
}
while(pin.length < 6)
return pin.subString(0, 6);
}
这是一个函数的(粗略)示例,该函数将始终从相同的电话号码返回相同的pin码,并且通过使用唯一的密钥,外人永远无法复制。理论上你可以有一个熵的问题,但在现实中不是这样的规模。
如果你只是想从一个电话号码创建一个PIN(其中电话号码是唯一的,PIN不一定是唯一的),你可以使用许多哈希函数之一,如CRC32, MD5, SHA1,…只取你需要的字节/数字。
请注意,使其安全并不简单(如果您想要的话),因为散列函数通常只会使计算原始值变得更加困难(在您的情况下,从PIN中计算出数字),反之亦然。