Python开发工具PyCharm入门指南 - 如何创建密码短语生成器(下)

news/2024/11/24 21:07:33/

PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。

PyCharm 最新版下载

在上篇文章中,我们学习了密码短语、密码短语生成器的概念并生成了第一个密码短语,本文继续介绍如何创建更好的密码短语,使其更容易记忆,并且更难被破解。

创建更好的密码

使密码短语更容易记忆

您可能已经注意到,在上一步中生成的密码短语有点难读。如何将每个单词大写以提高可读性?

我们在此应用程序中使用 Typer,因为我们不想只运行脚本并获取密码。我们需要创建一个命令行界面,以便我们可以将各种选项传递给脚本,从而控制生成的密码的属性。一种选择是将单词大写。

当我们运行main.py时,会执行以下行:

...
if __name__ == "__main__":
typer.run(main)

所以,我们将使用typer来执行main函数。我们这样做是因为 Typer 可以接受命令行参数,然后将它们作为参数传递给函数。

让我们capitalize在main()函数中引入参数并使其False默认:

def main(capitalize = False):
sub_nouns = read_words('sub_nouns.txt')
...
passphrase = ''.join(phrase_words)
print(passphrase)

根据 Python 编码最佳实践,我们应该指定参数类型。将插入符号放在上面capitalize并按⌥Enter / Alt+Enter。然后选择Specify type for the reference using annotation。Type bool,因为它capitalize应该有一个Boolean值。

现在,如果capitalize为True,让我们在连接单词之前将它们大写。以if大写:开始if语句。让我们以类似于修复read_words函数时使用的方式来实现它,只不过这次我们将使用一个活动模板,而不是手动编写列表推导式。输入“compl”并按“Enter”。然后指定列表推导式的所有元素,并按Tab键移动到下一个元素。

你将得出:

def main(capitalize: bool = False):
sub_nouns = read_words('sub_nouns.txt')
verbs = read_words('verbs.txt')
adjectives = read_words('adjectives.txt')
obj_nouns = read_words('obj_nouns.txt')
word_bank = [sub_nouns, verbs, adjectives, obj_nouns]
phrase_words = []
for word_list in word_bank:
random_word = random.SystemRandom().choice(word_list)
phrase_words.append(random_word)
if capitalize:
phrase_words = [phrase_word.capitalize() for phrase_word in phrase_words]
passphrase = ''.join(phrase_words)
print(passphrase)

为了确保大写字母正常运行,我们需要在运行main.py时将capitalize作为参数传递。要实现这一点,让我们编辑运行配置。在IDE窗口的顶部寻找Run小部件:

您可以使用这个小部件来选择所需的运行配置,以及在运行或调试模式下启动它。当我们单击gutter图标并启动脚本时,PyCharm已经创建了主配置。单击配置名称,打开菜单,选择Edit configurations:

在打开的对话框中,在Parameters字段中指定——capitalize:

单击OK保存更新后的配置。然后单击小部件中的Run图标。

结果如下:

为了更好的可读性,我们可以将密码短语中的单词分开。使用特殊字符作为分隔符可以达到双重目的,因为它可以让我们生成符合特定密码复杂度要求的密码短语。

按如下方式编辑main()函数的倒数第二行:

def main(capitalize: bool = False):
...
passphrase = separator.join(phrase_words)

PyCharm用一条红色波浪线突出显示分隔符,因为函数还没有这个参数。将鼠标悬停在它上面,并在弹出窗口中选择创建参数“separator”。然后将“”指定为默认值,因为在默认情况下我们不想添加任何分隔符。

我们还指定str作为参数类型。你应该得出以下内容:

def main(capitalize: bool = False, separator: str = ''):
...
passphrase = separator.join(phrase_words)
print(passphrase)

现在,更新运行配置。单击Run小部件,选择Edit configurations,并在Parameters字段中添加新参数:

运行配置查看结果:

现在你可以用特殊字符和数字来分隔密码中的单词。您甚至可以使用几个符号来满足各种网站的密码要求,例如“#4”或“%7”。

让密码短语更难破解

密码短语越长,成功暴力攻击需要尝试的次数就越多。让我们在密码中加入一个额外的单词。

首先,我们将准备第五个包含副词的单词列表,并将其放在项目目录中。将bool类型的long参数添加到main()函数的签名中。根据这个参数(该参数是可选的,默认设置为False),我们将向word_bank添加另一个单词列表:

def main(capitalize: bool = False, separator: str = '', long: bool = False):
...
word_bank = [sub_nouns, verbs, adjectives, obj_nouns]
if long:
adverbs = read_words('adverbs.txt')
word_bank.append(adverbs)
...

这一次,让我们使用内置终端来运行脚本。按Ctrl +F12 / Alt+F12,在打开的终端工具窗口中输入以下命令:

python main.py --capitalize --separator "1_" --long

你应该得到类似下面内容的结果:

使用工具的准备

定义简短的选项名称

如果您以前使用过CLI工具,就会知道它们通常只允许用户使用一个字母指定参数。让我们将此功能也添加到我们的工具中。为了更好的代码可读性,让我们重新格式化函数签名,以便每个参数都在单独的行上:

def main(
capitalize: bool = False,
separator: str = '',
long: bool = False
):
...

然后将每个参数的默认值替换为type。选项(<default_value>, <long_name>, <short_name>):

下面是main()的最终签名:

def main(
capitalize: bool = typer.Option(False, '--caps', '-c'),
separator: str = typer.Option('', '--separator', '-s'),
long: bool = typer.Option(False, '--long', '-l')
):
...

现在我们可以一起指定所有选项。分隔符(' -s ')应该放在最后,因为它后面需要一个字符串:

文件的选项

默认情况下,type还添加了——help选项。现在让我们看看它是如何工作的:

我们可以理解存在哪些参数以及它们的长、短名称。如何添加注释来解释它们的实际作用?为main()的每个参数添加help如下:

现在——help产生了更多有用的信息:

您可能希望使用没有PyCharm的密码短语生成器,例如在系统终端中。在这种情况下,您应该使用以下命令将type安装到系统解释器中:

python3 -m pip install --user typer

以上便是如何创建更好的密码短语的全部内容,如果您有其他问题也可以继续浏览本系列文章,获取相关教程,你还可以给我留言或者加入我们的官方技术交流群。


http://www.ppmy.cn/news/139284.html

相关文章

手写字体生成

风格迁移在图像应用 https://github.com/LDOUBLEV/style_transfer-perceptual_loss 基于风格迁移的手写字体生成 http://www.dataguru.cn/article-11281-1.html 论文&#xff1a;http://www.doc88.com/p-8058499366708.html

C笔记(手写)

循环&#xff08;for,switch&#xff09; 算平均数 整数逆序 (break,continue,goto) 取得最大值 整数分解 辗转相除 数组 自定义函数 return 二维数组 求数组大小 数组间的赋值

前端手写(十五)——手写new的过程

一、写在前面 我们如果想要手写new的实现过程&#xff0c;就必须要明白&#xff0c;当我们对一个构造函数执行new操作时&#xff0c;到底干了什么。 1、创建一个新对象。 2、让这个新的对象的原型指向该构造函数的原型对象。 3、执行构造函数&#xff0c;并且将构造函数指向新…

前端手写(三)——手写深拷贝

一、写在前面 深拷贝就是对对象的深度拷贝&#xff0c;假如我们对象中的字段值任然是对象&#xff0c;如果使用浅拷贝&#xff0c;则只能拷贝对象的地址。实现深拷贝存在三种方法: 1、使用JSON.stringify和JSON.parse方法 2、手写一个深拷贝函数。 3、使用第三方库lodash。 下面…

FS162液晶手写板擦写专用芯片

特性 FEATURES应用 APPLICATIONS技术指标 SPECIFICATIONS参数 最小值 典型值 最大值 单位温度范围 -25 25 85 ℃工作电压 2.2 3.0 5.0 V擦写电压 25 40 V待机电流 0.01 0.05 uA工作电流 3 20 mA● 擦写脉冲电压可调&#xff08;外置调压电阻&#xff09;工作电压范围宽&#xf…

印象智能手写板体验:低成本手写方案

电子时代有好多人还保持着手写记录的习惯&#xff0c;当然要保证信息安全的话&#xff0c;还是把手写文字转化为电子笔记更稳妥。目前有这几种解决方案&#xff1a;最简单的&#xff0c;在纸上记录后用手机扫描&#xff0c;然后 OCR 识别为电子格式&#xff1b;或者买一个电子纸…

手写数字识别(1)

#3.6.1 MNIST数据集 MNIST数据集是由0到9的数字图像构成的。训练图像有6万张&#xff0c;测试图像有1万张&#xff0c;这些图像可以用于学习和推理。MNIST数据集的一般使用方法是&#xff0c;先用训练图像进行学习&#xff0c;再用学习到的模型度量能在多大程度上对测试图像进行…

OCR手写字体生成数据

简述&#xff1a; 根据CASIA的HWDB1.X的手写字符生成了一些带有字符级标注、行级别标注的文本数据&#xff0c;分享给需要的同学。 生成基于不同人的字体、字体大小、行间字体间隔、旋转角度、文本布局的文字贴图。 生成素材&#xff1a;共65种贴图背景&#xff0c; 由420位手写…