”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 Go 中构建密码管理器:第 2 部分

在 Go 中构建密码管理器:第 2 部分

发布于2024-11-01
浏览:908

欢迎回到我们在 Go 中构建密码管理器的旅程!在第二部分中,我们将探讨自初次提交以来我们所取得的进展。我们添加了新功能,改进了代码结构并实施了测试。让我们开始吧!

改进项目结构

您会注意到的第一个变化是改进的项目结构。我们遵循 Go 的最佳实践,将代码分成多个文件和包:

dost/
.
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── internal
│   ├── internal_test.go
│   └── passgen.go
└── main.go

随着我们项目的发展,这种结构可以实现更好的组织和可维护性。

增强的命令行界面

我们显着改进了 CLI,使其更加灵活且用户友好。这是 main.go 的片段:

func main() {
    generateCmd := flag.NewFlagSet("generate", flag.ExitOnError)
    flag.Parse()

    switch os.Args[1] {
    case "generate":
        internal.Generate(generateCmd)
    }
}

此设置允许使用子命令,当前支持生成命令。用户现在可以像这样与我们的工具交互:

go run main.go generate email/[email protected] 15

可定制的密码生成

我们添加了自定义密码生成的选项。用户现在可以指定密码长度并选择排除特殊字符:

func Generate(generateFlags *flag.FlagSet) {
    generateFlags.BoolVar(&noSymbols, "n", false, "Skip symbols while generating password")
    generateFlags.BoolVar(&copyToClipBoard, "c", false, "Copy to clipboard.")
    generateFlags.Parse(os.Args[2:])
    passwordLength := 25
    // ... (code to parse custom length)

    password, err := generatePassword(passwordLength, noSymbols)
    // ... (code to handle password output)
}

此功能允许用户使用 -n 等标志来排除符号,使用 -c 将密码复制到剪贴板而不是显示它。

改进的密码生成算法

我们改进了密码生成功能以处理新的自定义选项:

func generatePassword(length int, noSymbols bool) (string, error) {
    const (
        uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
        digits           = "0123456789"
        specialChars     = "!@#$%^&*()-_= []{}|;:'\",./?"
    )

    allChars := uppercaseLetters   lowercaseLetters   digits
    if !noSymbols {
        allChars  = specialChars
    }

    var password string
    for i := 0; i 


此函数现在遵循 noSymbols 标志,允许更灵活的密码生成。

实施测试

我们通过实施测试,在确保代码可靠性方面迈出了重要一步。这是我们的测试文件的片段:

func TestPasswordLength(t *testing.T) {
    password, err := generatePassword(10, true)
    if err != nil {
        t.Errorf("Expected no error, got %v", err)
    } else {
        if len(password) != 10 {
            t.Errorf("Expected 10 character password, got %d", len(password))
        }
    }
}

func TestSpecialCharacter10K(t *testing.T) {
    splCharMissing := 0
    for i := 1; i  0 {
        t.Errorf("Special character was missing in %d / 10000 instances.", splCharMissing)
    }
}

这些测试检查密码长度是否正确以及是否包含特殊字符。有趣的是,我们的特殊字符测试揭示了一个需要改进的地方:在 10,000 个生成的密码中,有 234 个不包含特殊字符。这为我们下一步的改进提供了明确的方向。

接下来是什么?

虽然我们取得了重大进展,但仍有改进的空间:

  1. 完善密码生成算法,确保特殊字符的一致包含。
  2. 实现密码存储功能。
  3. 为存储的密码添加加密。
  4. 开发搜索和检索功能。

请继续关注我们系列的下一部分,我们将解决这些挑战并继续发展我们的密码管理器!

请记住,完整的源代码可在 GitHub 上找到。请随意克隆、分叉并为该项目做出贡献。随时欢迎您的反馈和贡献!

祝您编码愉快,并保持安全! ??

Building a Password Manager in Go: Part 2 斯韦马拉朱 / 多斯特

用 Go 编写的 dost 命令行密码管理器

dost

dost 是一个用 Go 编写的 CLI 密码管理器。

灵感来自(通行证)[https://www.passwordstore.org/]

特征

  • 生成可配置长度的随机密码
  • 自动将生成的密码复制到剪贴板
  • 使用符号跳过

用法

> go build -o dost main.go
进入全屏模式退出全屏模式

生成密码:

> ./dost generate email/[email protected]
Generated Password: );XE,7-Dv?)Aa &

生成指定长度的密码(默认为25):

> ./dost generate email/[email protected] 12
Generated Password: si

将生成的密码复制到剪贴板而不打印:

> ./dost generate -c email/[email protected] 
Copied to clipboard! ✅

避免使用符号生成密码:

> ./dost generate -n email/[email protected] 
Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H

正在开发中

  • 手动插入新密码
  • 显示现有密码
  • 列出所有条目
  • 密码存储
  • 基于 GPG 密钥的加密

执照

麻省理工学院




在 GitHub 上查看


版本声明 本文转载于:https://dev.to/svemaraju/building-a-password-manager-in-go-part-2-5adf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何解决 Alpine 容器 Go 中 Pingdom API 的 x509 证书问题?
    如何解决 Alpine 容器 Go 中 Pingdom API 的 x509 证书问题?
    x509 Go 中 Pingdom API 的证书问题在利用 pingdom-go 包与 Pingdom API 交互时,容器化应用程序遇到以下问题错误:“获取 https://api.pingdom.com/api/2.1/checks/0:x509:由未知颁发机构签名的证书。”这意味着容器化应用...
    编程 发布于2024-11-07
  • 前端 UI 组件
    前端 UI 组件
    iHateReading 自定义存储库 在过去的一个月里,我制作了很多 UI 组件,这些组件是真实世界的 Web 组件,例如按钮、输入、表单、横幅、画廊 出于多种目的而制造的组件 学习前端并在我所做的事情上变得更好 提高前端开发中编写更好代码的能力(稍后我会解释这意味着什么) 我目...
    编程 发布于2024-11-07
  • 我可以仅使用 .frm 文件恢复 MySQL 数据库吗?
    我可以仅使用 .frm 文件恢复 MySQL 数据库吗?
    使用 .frm 文件恢复 MySQL 数据库执行常规数据库备份时,捕获整个数据库结构和数据至关重要。数据。但是,在某些情况下,用户可能只能访问 .frm 文件,该文件代表表结构,而不是实际数据。在这种情况下,仅使用 .frm 文件恢复数据库及其数据可能具有挑战性。幸运的是,在某些情况下可以从 .fr...
    编程 发布于2024-11-07
  • 在 PHP 中启用或禁用“allow_url_fopen”:评估风险和替代方案
    在 PHP 中启用或禁用“allow_url_fopen”:评估风险和替代方案
    授予或不授予:探索 PHP 中 'allow_url_fopen' 的用法开发者经常请求激活 'allow_url_fopen' 功能在生产服务器上。鉴于当前的网络开发状况,确定此权限是否仍然是必要的或者是否有更好的替代方案至关重要。评估情况做出决定之前,请考虑以下事...
    编程 发布于2024-11-07
  • 如何覆盖 PHP 的 `mail()` 函数中的信封返回地址?
    如何覆盖 PHP 的 `mail()` 函数中的信封返回地址?
    如何在 PHP Mail 中覆盖信封返回地址为了解决使用 PHP 的 mail() 函数设置信封返回地址的问题,这个答案提供了一个简单的解决方案。mail() 函数接受可选的第四个和第五个参数。虽然第四个参数用于设置标头,但第五个参数可用于将选项直接传递给底层的 sendmail 命令。通过在第五个...
    编程 发布于2024-11-07
  • 科技观察 #1
    科技观察 #1
    大家好,这是我上周的技术手表,其中包含很多 #react、一点 #html、一些 #css 和 #npm。 ? https://www.totaltypescript.com/how-to-create-an-npm-package 如何创建 NPM 包 创建、测试和发布 NPM 包(从初始化到发布...
    编程 发布于2024-11-07
  • mysqli_fetch_array() 何时显示错误“期望参数 1 为 mysqli_result,给定布尔值”?
    mysqli_fetch_array() 何时显示错误“期望参数 1 为 mysqli_result,给定布尔值”?
    mysqli_fetch_array() 期望 MySQLi 结果,而不是布尔值在给定的 PHP 代码中,错误“mysqli_fetch_array() 期望参数 1 为mysqli_result, boolean Give" 表示使用 mysqli_query() 的查询执行失败,它返回...
    编程 发布于2024-11-07
  • 子集和问题的 PHP 程序
    子集和问题的 PHP 程序
    子集和问题是计算机科学和动态规划中的经典问题。给定一组正整数和一个目标和,任务是确定是否存在给定集合的子集,其元素之和等于目标和。 子集和问题的PHP程序 使用递归解决方案 例子 <?php // A recursive solution for the subset sum problem ...
    编程 发布于2024-11-07
  • JavaScript 数组方法:综合指南
    JavaScript 数组方法:综合指南
    数组是 JavaScript 中最基本的数据结构之一。使用数组,您可以在单个变量中存储多个值。 JavaScript 提供了许多内置方法来操作数组,使它们具有令人难以置信的通用性。在这篇文章中,我们将探讨所有内置数组方法以及如何在 JavaScript 项目中有效地使用它们。 核心方...
    编程 发布于2024-11-07
  • 高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    每次我用 TypeScript 写成 Foo 时,我都会感受到失败的沉重。 在一种情况下,这种感觉特别强烈:当函数采用的参数取决于哪个 "mode" 处于活动状态时。 通过一些示例代码更清晰: type Provider = "PROVIDER A" | "PR...
    编程 发布于2024-11-07
  • 如何创建人力资源管理解决方案
    如何创建人力资源管理解决方案
    1. Understanding the Basics of Frappe and ERPNext Task 1: Install Frappe and ERPNext Goal: Get a local or cloud-based instance of ERP...
    编程 发布于2024-11-07
  • 从周五黑客到发布:对创建和发布开源项目的思考
    从周五黑客到发布:对创建和发布开源项目的思考
    从周五补丁破解到发布:对创建和发布开源项目的思考 这是针对初学者和中级开发人员的系列的一部分,通过将他们的想法作为开源项目发布或引起兴趣。 这些想法是有偏见的和个人的。计划发布更多文章。通过分享一些思考,我希望能启发你做自己的项目 思考(此) 作为 Java 开发人员学习 Go l...
    编程 发布于2024-11-07
  • 可以使用 constexpr 在编译时确定字符串长度吗?
    可以使用 constexpr 在编译时确定字符串长度吗?
    常量表达式优化:可以在编译时确定字符串长度吗?在优化代码的过程中,开发人员尝试计算使用递归函数在编译时计算字符串文字的长度。此函数逐字符计算字符串并返回长度。初始观察:该函数似乎按预期工作,在运行时返回正确的长度并生成表明计算发生在编译时的汇编代码。这就提出了一个问题:是否保证length函数会在编...
    编程 发布于2024-11-07
  • 在 Raspberry Pi 上运行 Discord 机器人
    在 Raspberry Pi 上运行 Discord 机器人
    Unsplash 上 Daniel Tafjord 的封面照片 我最近完成了一个软件工程训练营,开始研究 LeetCode 的简单问题,并觉得如果我每天都有解决问题的提醒,这将有助于让我负起责任。我决定使用按 24 小时计划运行的不和谐机器人(当然是在我值得信赖的树莓派上)来实现此操作,该机器人将执...
    编程 发布于2024-11-07
  • 解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    In the ever-evolving landscape of web development, JavaScript remains a cornerstone technology powering countless large-scale web applications. While...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3