我需要生成一些密码,我想避免可能相互混淆的字符。是否有明确的我应该避免的角色列表?我目前的清单是
il10o8B3Evu![]{}
还有其他容易混淆的字符对吗?对于特殊字符,我将自己限制在数字键下,尽管我知道这取决于您的键盘国籍!
作为一个骑手的问题,我希望我的密码是“wordlike”你有一个喜欢的算法吗?
谢谢 :)
我需要生成一些密码,我想避免可能相互混淆的字符。是否有明确的我应该避免的角色列表?我目前的清单是
il10o8B3Evu![]{}
还有其他容易混淆的字符对吗?对于特殊字符,我将自己限制在数字键下,尽管我知道这取决于您的键盘国籍!
作为一个骑手的问题,我希望我的密码是“wordlike”你有一个喜欢的算法吗?
谢谢 :)
以下是 Steve Gibson 用于他的“Perfect Paper Password”系统的字符集。它们是“允许的字符”而不是“要避免的字符”,但它们对于您想要的似乎非常合理:
一组标准的 64 个字符
!#%+23456789:=?@ABCDEFGHJKLMNPRS
TUVWXYZabcdefghijkmnopqrstuvwxyz
更大的 88 个字符集
!"#$%&'()*+,-./23456789:;<=>?@ABCDEFGHJKLMNO
PRSTUVWXYZ[\]^_abcdefghijkmnopqrstuvwxyz{|}~
我首选的方法是获取 3、4 和 5 个字母单词的单词列表。然后选择其中至少 2 个,并在每个单词之间放置一个随机的 2 位数字或特殊符号 (%&*@#$)。如果您愿意,每个单词最多可以随机大写一个字符。
根据您的强度要求,您最终会得到易于记忆和交流的密码,例如:
请记住,您偶尔会得到有趣或不恰当的单词组合(我会让您发挥您的想象力)。如果不喜欢所提供的密码,我通常有一个按钮允许生成新密码。
通常,只使用人们通常知道其名称的符号。在美国标准键盘上,我会避免使用 ~`'/\^
我想这比您的主要问题更能回答您的骑手问题。..
祝你好运!
阅读选择安全密码。
那里有一个有趣的花絮:要获得更安全的密码,请确保一些数字和特殊字符出现在中间。破解程序在开始时会检查它们,并且会更快结束。
要添加到吉姆的答案,您还可以使用单词列表并用符号随机替换某些字符(@ 表示 A,0(零)表示 O 或 5 表示 S)和/或从单词中删除元音.
仍然主要是人类可读的。
作为另一种选择,您可以使用等宽/终端字体(如 courier)来打印密码。这样,相似的字符应该更容易区分。
几年前,对于一个国际客户,我必须生成随机、安全的密码,然后我的客户将这些密码邮件合并到文档中,并通过邮寄方式发送给 40 个国家/地区的收件人。由于不知道文档中要使用什么字体,我使用了一个字符列表,例如 Steve Gibson 64 字符集,以消除相似字形之间的混淆。
为了使生成的密码发音清晰,从而更容易记住,我将辅音和元音配对在一起,并添加了一些辅音有向字母(sh、th、wh 等)。
为了减少生成不适当或冒犯性单词的机会(用英语或接收者的语言),我将连续的字母字符限制为两个,并在中间使用数字或标点符号:
Es4tU$sA6
wH@cY8Go2
现在回顾我的方法,我意识到不适当性算法还有改进的空间。仅使用上面的规则,现在一些冒犯性的词是可能的,因为一些数字和标点符号被替换了字母。
对于人类可读的密码,我最近使用了一个与下面的非常相似的 PHP 脚本。它运作良好。诚然,密码不会非常安全(因为它们容易受到字典攻击),但对于可记忆或至少可读的密码来说,它工作得很好。但是,这个函数不应该按原样使用,它更多的是为了说明而不是其他任何东西。
function generatePassword($syllables = 2, $use_prefix = true)
{
// Define function unless it is already exists
if (!function_exists('arr'))
{
// This function returns random array element
function arr(&$arr)
{
return $arr[rand(0, sizeof($arr)-1)];
}
}
// Random prefixes
$prefix = array('aero', 'anti', 'auto', 'bi', 'bio',
'cine', 'deca', 'demo', 'dyna', 'eco',
'ergo', 'geo', 'gyno', 'hypo', 'kilo',
'mega', 'tera', 'mini', 'nano', 'duo',
'an', 'arch', 'auto', 'be', 'co',
'counter', 'de', 'dis', 'ex', 'fore',
'in', 'infra', 'inter', 'mal',
'mis', 'neo', 'non', 'out', 'pan',
'post', 'pre', 'pseudo', 'semi',
'super', 'trans', 'twi', 'vice');
// Random suffixes
$suffix = array('dom', 'ity', 'ment', 'sion', 'ness',
'ence', 'er', 'ist', 'tion', 'or',
'ance', 'ive', 'en', 'ic', 'al',
'able', 'y', 'ous', 'ful', 'less',
'ise', 'ize', 'ate', 'ify', 'fy', 'ly');
// Vowel sounds
$vowels = array('a', 'o', 'e', 'i', 'y', 'u', 'ou', 'oo', 'ae', 'ea', 'ie');
// Consonants
$consonants = array('w', 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'j',
'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'qu');
$password = $use_prefix?arr($prefix):'';
$password_suffix = arr($suffix);
for($i=0; $i<$syllables; $i++)
{
// selecting random consonant
$doubles = array('n', 'm', 't', 's');
$c = arr($consonants);
if (in_array($c, $doubles)&&($i!=0)) { // maybe double it
if (rand(0, 2) == 1) // 33% probability
$c .= $c;
}
$password .= $c;
//
// selecting random vowel
$password .= arr($vowels);
if ($i == $syllables - 1) // if suffix begin with vovel
if (in_array($password_suffix[0], $vowels)) // add one more consonant
$password .= arr($consonants);
}
// selecting random suffix
$password .= $password_suffix;
return $password;
}
在我的(电气工程、技术)研究生院中,所有计算机帐户都使用密码进行初始化,我认为这些密码是由标准 linux 实用程序生成的。它们由三个随机音节组成,每个音节中有三个小写字母。结果是相当安全的(大约有数十亿种可能的组合),但又如此清晰,以至于我在十多年后仍然使用其中的一些密码。詹姆斯的例子很好地证明了这一点。
网络安全专家对密码的一般评论:它们很糟糕,有几个原因,包括:
通常很容易被破坏,无论是通过社会工程还是使用攻击软件,尤其是当您对目标 有所了解时。
示例 1: 我最近需要修改受密码保护的技术文档。看着日期,我知道当时我们的驻地技术作家是谁,输入了我脑海中的第一个词,然后立即解锁了文件。
示例 2: 标准密码破解程序允许破解者指定一组对用户提供的字典进行操作的规则。用 $ymb01$ 替换某些字母或翻译成 1337 等是微不足道的。
“安全”密码不是。鉴于大多数人需要记住的密码数量之多,“记住”像“a4$N!8_q”这样的“强”密码的最常见方法是将其写在一张纸上(或者更糟的是,将其存储在一个文本文件)。'纳夫说。
如果您需要真正安全的身份验证,多因素(或双因素)是行业接受的机制。“两个因素”通常是您拥有的东西(例如访问卡)和您知道启用它的东西(例如 PIN)。没有另一个,两者都无法工作——你需要两者。
另一方面,请考虑您真正需要的安全级别。你在保护什么?“坏人”想要得到它有多严重,如果他们这样做了会有什么后果?机会是,“Its@Secret!” 绰绰有余。:-)
我不喜欢 wordlist 方法。例如,在 OSX 上的 /usr/share/dict/words 中,有 5110 个 4 字符的单词。将其中两个与分隔符一起使用会产生约 600M 的组合。但是,如果您直接将字符集与强随机数生成器一起使用,您将拥有 88^9 种可能的密码,3.16e+17 种组合。
无论哪种方式,针对该系统的可能攻击都将针对随机数生成器,因此请确保您使用的是加密强的。如果使用 PHP 的标准 rand 函数,它会通过注册和重置数千个密码来进行攻击,以采样 RNG 状态,然后预测剩余的 RNG 状态,这将减少攻击者需要测试的可能密码数量。
一种起始方法可能是生成大部分有效的英语音节,将它们混合,然后进行 text->l33t 转换。已经对世代自然语言语法进行了研究,因此其中一项可能会有所帮助。
例如 ah ul ing 都是有效音节或接近它...混合它们 -> Ingulah...l33t it -> 1ngu4h。它是最好的吗?不。但至少它是半发音的(如果你说 l33t)并且在计算上更安全。
function random_readable_pwd($length=12){
// special characters
$sym="!\"§$%&/()={[]}\,.-_:;@>|";
// read words from text file to array
$filename="special.txt";
if (!file_exists($filename)) { die('File "'.$filename.'" is not exists!'); }
$lines = file($filename);
foreach ($lines as $line_num => $line) {
$line=substr($line, 0, -2);
$words[].=$line;
}
// Add words while password is smaller than the given length
$pwd = '';
$ran_date=date("s");
while (strlen($pwd) < $length){
$r = mt_rand(0, count($words)-1);
// randomly upercare word but not all in one time
if ($ran_date % 3 == 0) $words[$r]=ucwords($words[$r]);
$pwd .= $words[$r];
//randomly add symbol
if ($ran_date % 2 == 0) $pwd .= $sym{mt_rand(0,strlen($sym))};
$ran_date++;
}
// append a number at the end if length > 2 and
// reduce the password size to $length
$num = mt_rand(1, 99);
if ($length > 2){
$pwd = substr($pwd,0,$length-strlen($num)).$num;
} else {
$pwd = substr($pwd, 0, $length);
}
return $pwd;
}