自动生成的密码中应避免使用的字符
-
09-06-2019 - |
题
我需要生成一些密码,我想避免可能相互混淆的字符。是否有我应该避免使用的明确字符列表?我当前的清单是
il10o8B3Evu![]{}
还有其他容易混淆的字符对吗?对于特殊字符,我将限制自己使用数字键下的字符,尽管我知道这会根据您的键盘国籍而有所不同!
作为一个骑手问题,我希望我的密码是“类似文字的”,您有更喜欢的算法吗?
谢谢 :)
解决方案
以下是史蒂夫·吉布森 (Steve Gibson) 在他的作品中使用的字符集 《完美的纸质密码》 系统。它们是“允许的字符”而不是“要避免的字符”,但它们对于您想要的东西似乎相当合理:
64 个字符的标准集
!#%+23456789:=?@ABCDEFGHJKLMNPRS
TUVWXYZabcdefghijkmnopqrstuvwxyz
更大的 88 个字符集
!"#$%&'()*+,-./23456789:;<=>?@ABCDEFGHJKLMNO
PRSTUVWXYZ[\]^_abcdefghijkmnopqrstuvwxyz{|}~
其他提示
我首选的方法是获取包含 3、4 和 5 个字母的单词的单词列表。然后至少选择其中 2 个,并在每个单词之间放置一个随机的 2 位数字或特殊符号 (%&*@#$)。如果您愿意,每个单词最多可以随机大写一个字符。
根据您的强度要求,您最终会获得易于记忆和交流的密码,例如:
- 柠檬%书桌
- 纸&男孩32帽子
请记住,您偶尔会遇到有趣或不恰当的单词组合(我会让您发挥您的想象力)。我通常有一个按钮,如果不喜欢所提供的密码,可以生成新密码。
通常,仅使用人们通常知道其名称的符号。在美国标准键盘上我会避免〜`'/\^
我想这比你的主要问题更能回答你的骑手问题。..
祝你好运!
读 选择安全密码.
那里有一个有趣的花絮:为了更安全的密码,请确保一些数字和特殊字符出现在中间。破解程序会在开始时检查它们并更快结束。
要添加到吉姆的答案中,您还可以使用单词列表并随机用符号替换某些字符(A 为 @,O 为 0(零),S 为 5)和/或从单词中删除元音。
- lmn%办公桌
- p@per&b0y32H@t
仍然主要是人类可读的。
作为另一种选择,您可以使用等宽/终端字体(例如 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)。两者缺一不可——两者都需要。
另一方面,考虑您真正需要的安全级别。你在保护什么?“坏人”有多想得到它,如果他们这样做了,后果是什么?机会是“它的@秘密!”足够好。:-)
我不喜欢单词表方法。例如,在 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)并且计算上更安全。
如果您对生成可发音的密码感兴趣,可以使用 C# 端口:http://www.hoogervorst.ca/arthur/?attachment_id=1708
在代码中,您将找到有用的链接来了解更多信息。http://www.multicians.org/thvv/gpw.html
祝你好运。詹姆士
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;
}