我想从字符串中生成一个唯一的数字。该字符串是用户名和密码的组合。我想从这个组合生成一个唯一的数字ID(不是字符串)。我首先md5组合,然后将其转换为数字。号码长度需要为10.有任何建议吗?
答案 0 :(得分:0)
最好能否提供有关您尝试与之接口的第三方的更多详细信息,因为这是一个非常奇怪的请求,它包含一个基本缺陷。您要求数字为唯一,但您只允许10个十进制(“数字ID”)数字,或约100亿个可能值。
这听起来很糟糕,但事实并非如此。这为您提供了超过33位的哈希值。 http://davidjohnstone.net/pages/hash-collision-probability处的简单哈希冲突概率计算器在仅100,000个条目下发生碰撞的概率为44%。但是假设完全使用了所有可用的输入字符。由于用户名和密码组合几乎总是限于字母和数字字符,因此真正的碰撞机会在更少的条目下更糟糕(如果不知道这些字段允许的字符就无法计算 - 但这很糟糕)。
NodeJS在crypto
模块中提供了许多加密函数。提供了一整套散列函数,包括理想情况的SHA *选项。这些可以用来提供具有天文碰撞概率的安全,不可逆的哈希值。
如果这些选项对你不适用,我建议你有一个基本的设计缺陷。您几乎肯定会将用户/通行证组合映射到远程系统中的用户ID,攻击者会发现这种方式容易与简单的暴力攻击妥协,因为模型中存在高冲突风险。
如果您正在做我认为您正在做的事情,那么“正确”的方法是在某个服务器上安装一个简单的数据库。用户/传递将在那里被分配一个唯一的ID,这与它是什么无关 - 它可以是单个MySQL表中的自动增量ID字段。然后,服务器将使用所需API调用的ID值联系此远程服务,并将结果返回给用户。这消除了安全风险,因为用户名/密码实际上没有进行哈希处理,只是存储,并且可以在每次通话时100%检查。
切勿将哈希用作主数据值。这是一种简化,而不是一种真正的价值。