C# 根据电话号码生成唯一的PIN码

C# 根据电话号码生成唯一的PIN码,c#,C#,使用一个唯一的电话号码,如0241194000,我想根据电话号码生成PIN码,并通过一种方法检查或验证PIN码是否确实是从电话号码生成的 范例 Number : 0241194000 LENGHT(10) PIN : 675436 LENGHT(6) ONLY NUMERIC Checker : 673AA3738SHZXCVDER ANY LENGTH

使用一个唯一的电话号码,如
0241194000
,我想根据电话号码生成PIN码,并通过一种方法检查或验证PIN码是否确实是从电话号码生成的

范例

Number  : 0241194000                      LENGHT(10)
PIN     : 675436                          LENGHT(6)     ONLY NUMERIC
Checker : 673AA3738SHZXCVDER              ANY LENGTH    ALPHANUMERIC.

任何链接或帮助都会很好。

您想要的是一个数学双射函数(最好是复杂函数) 通过上述功能,可将任意数字(x)转换为引脚

F(数字)=PIN

通过使用双射函数,可以通过在相反方向上求解方程来验证管脚

例如:

给定函数:F(Number)=Number*2

function GeneratePIN(Number)
    return Number*2
end

function validatePIN(PIN,Number)
    return PIN == Number*2
end

如果您只想从电话号码创建PIN(其中电话号码是唯一的,PIN不一定是唯一的),则可以使用许多散列函数之一,例如CRC32、MD5、SHA1等。。。只取所需的字节数/数字


请注意,使其安全并不简单(如果您愿意的话),因为散列函数通常只会使计算原始值变得更困难(在您的情况下,从PIN中计算数字)反之亦然。

尽管上面有正确的评论,你不能创建一个比其源代码集短的唯一PIN(它归结为散列,根据定义,它从来都不是唯一的),但我假设你指的是一个“外部人员无法为电话号码复制的代码,并且在给定电话号码和PIN码的情况下,可以证明这些代码是相关的,同时接受同一PIN码在与其他电话号码一起使用时也可能有效。”

假设如此,最简单的解决方案是从电话号码创建一个salt散列。示例伪代码:

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);
}
static uniqueHash='9t45uufg92dit093ik,96igm0v9m6i09im09i309disl54923';
函数createPinFromPhone(字符串phonenumber)
{
字符串pin='';
做{
hash=md5(phonenumber+uniqueHash);
pin+=提取器numbersfromstring(散列);
phonenumber=pin+哈希;
}
而(销长度<6)
返回销。子串(0,6);
}

这是一个(粗糙的)例如,一个函数总是从同一个电话号码返回相同的pin码,并且通过使用唯一的密钥,外人永远无法复制该函数。理论上,你可能会遇到熵问题,但实际情况下不会出现熵问题。

这没有任何意义。我不理解从电话号码生成pin码,但检查器的用途是什么?我认为“PIN码”之前的“唯一”一词有多种解释。如果PIN码在整个系统中必须是唯一的,这确实是一个鸽子洞违规。@SLaks checker将确保PIN码是从电话号码生成的。我想我必须删除唯一的PIN码,只留下UNIQUE此解决方案要求您的PIN码更长或与您的号码长度相同。否则,由于明显的原因,双射无法工作。我认为最简单的一个是:添加到答案中。这显然不是一个非常安全的生成函数。但是,您如何判断提供的PIN码是否真实?通过调用
createPinFromPhone()
并根据用户提供的PIN检查生成的PIN?(出于完整性考虑询问此问题)@Meoiswa我们创建了另一个函数,该函数将根据电话号码和salt值进行验证。值得注意的是,salt生成的值将保存在数据库中。给定salt号码+电话号码,系统将返回相同的哈希代码。@Meoiswa由于鸽子洞问题,用户始终必须提供电话号码r与PIN一起。因此,由于“预共享密钥”,很容易重复操作并验证PIN是否正确。salt不一定需要进入数据库,只要有足够的熵和适当的安全性,它可以是一个系统范围内的常数-这当然取决于整个系统的要求,但对于大多数系统来说实际上不需要额外的开销。这个。谢谢你的澄清。