📜  生成一次性密码或唯一标识URL

📅  最后修改于: 2021-05-06 07:59:29             🧑  作者: Mango

一次性密码(OTP)是在计算机系统或其他数字设备上仅对一个登录会话或交易有效的密码。有关更多详细信息,请参阅此。

算法

从我们所有的可能性中随机选择字符,并从中生成所需长度的字符串。动态口令是长期性和随机性在6-7字符一般6-7字符,几乎可以保证在登录的安全方式。

应用领域

  • OTP广泛用于以下网站:Facebook,Google登录,Wifi –访问,铁路门户登录等。
  • 甚至GeeksforGeeks IDE都具有通过其编译的所有代码的唯一字符串。例如,https: //ide.geeksforgeeks.org/Ks84Ck在结尾处具有唯一字符串– “ Ks84Ck” ,仅对于此代码而言是唯一的。

它是如何产生的?
很有可能他们使用与生成OTP相同的算法。如果偶然(非常罕见),生成的唯一字符串之前已经生成,并且已与其他代码关联,则使用另一个随机字符串。

按照现在似乎只有六个字符的字符串的所有代码的唯一标识随机生成的。一时间将到,所有可能的六个字符的字符串可能会耗尽。因此,是的,即使与网络相关的内容也严重依赖于随机性。

两个OTP发生冲突的可能性

  • OTP的长度为6,并且OTP中所有可能字符的设置大小为62。因此,这对OTP的可能设置总数为62 12
  • 其中一些是– [{aaaaaa,aaaaaa},{aaaaaa,aaaaab},….. {456789,456788},{456789,456789}]
  • 但是,相等的一组OTP对可能为: 62 6 。其中一些是– [{aaaaaa,aaaaaa},{aaaaab,aaaaab},….. {456788,456788},{456789,456789}]
  • 因此,两个OTP发生冲突的可能性为:
    6262分之612 = 1/62 6 =56800235584分之1= 1.7605561 -11

因此,两个OTP碰撞的可能性比地球上生命的存在可能性低(从宇宙开始到存在一切,您将生存的年数与存在的所有生命的年数之比)。比静态密码更安全!

执行

CPP
// A C/C++ Program to generate OTP (One Time Password)
#include
using namespace std;
  
// A Function to generate a unique OTP everytime
string generateOTP(int len)
{
    // All possible characters of my OTP
    string str = "abcdefghijklmnopqrstuvwxyzABCD"
               "EFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int n = str.length();
  
    // String to hold my OTP
    string OTP;
  
    for (int i=1; i<=len; i++)
        OTP.push_back(str[rand() % n]);
  
    return(OTP);
}
  
// Driver Program to test above functions
int main()
{
    // For different values each time we run the code
    srand(time(NULL));
  
    // Declare the length of OTP
    int len = 6;
    printf("Your OTP is - %s", generateOTP(len).c_str());
  
    return(0);
}


Java
// A Java Program to generate OTP (One Time Password)
class GFG{
  
// A Function to generate a unique OTP everytime
static String generateOTP(int len)
{
    // All possible characters of my OTP
    String str = "abcdefghijklmnopqrstuvwxyzABCD"
            +"EFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int n = str.length();
  
    // String to hold my OTP
    String OTP="";
  
    for (int i = 1; i <= len; i++)
        OTP += (str.charAt((int) ((Math.random()*10) % n)));
  
    return(OTP);
}
  
// Driver code
public static void main(String[] args)
{
  
    // Declare the length of OTP
    int len = 6;
    System.out.printf("Your OTP is - %s", generateOTP(len));
}
}
  
// This code is contributed by PrinciRaj1992


Python3
# A Python3 Program to generate OTP (One Time Password)
import random
  
# A Function to generate a unique OTP everytime
def generateOTP(length):
      
        # All possible characters of my OTP
    str = "abcdefghijklmnopqrstuvwxyzAB\
    CDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    n = len(str);
  
    # String to hold my OTP
    OTP = "";
  
    for i in range(1,length+1):
        OTP += str[int(random.random()*10) % n];
  
    return (OTP);
  
# Driver code
if __name__ == '__main__':
  
    # Declare the length of OTP
    length = 6;
    print("Your OTP is - ", generateOTP(length));
  
# This code contributed by Rajput-Ji


输出(每次运行可能有所不同):

Your OTP is - 8qOtzy

时间复杂度: O(N),其中N =我们的OTP中的字符数

辅助空间:除了具有所有可能字符的字符串外,我们还需要O(N)空间来容纳OTP,其中N = OTP中的字符数