【发布时间】:2021-02-22 12:26:18
【问题描述】:
我在这里的第一篇文章。
我正在尝试用 C 语言编写一个程序,它会生成一个由数字、字母和大写字母组成的随机密码。问题是密码中的字符不能重复。我尝试了几种方法来防止这种情况发生,但似乎没有任何效果。
void createPassword() {
char password[LENGTH];
char nums[] = "0123456789";
char letters[] = "abcdefghijklmnopqrstuvwxyz";
char caps[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int selector = rand() % 3; //random choice of character type
int i;
printf("Vytvorene heslo: ");
for(i = 0;i < LENGTH;i++) {
if(selector == 1) { //if selector == 1, add number to password etc.
password[i] = nums[rand() % 10];
printf("%c", password[i]);
selector = rand() % 3;
}
else if(selector == 2) {
password[i] = letters[rand() % 26];
printf("%c", password[i]);
selector = rand() % 3;
}
else {
password[i] = caps[rand() % 26];
printf("%c", password[i]);
selector = rand() % 3;
}
}}
如果有人能告诉我下一步该怎么做,我会很高兴。
【问题讨论】:
-
请理解,通过人为地将随机抽取限制在字母表的任何特定子集,您实际上会使您的安全性更糟,而不是更好。
-
注意:我首先将
int selector = rand() % 3;放入循环中(并且,在分配之前,您可以测试角色是否已经存在,然后再试一次)跨度> -
问题是密码中的字符不能重复这意味着它是NOT随机的。
-
"问题是密码中的字符不能重复。"作为观察,这意味着密码不是真正随机的,尽管从技术上讲 rand() 无论如何都不是真正随机的。但当然,这只是一种观察,而不是对您的密码方法的批评。
-
致所有响应者:使用
srand()可能会导致非常不安全的密码。