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

用 Go 构建密码管理器

发布于2024-11-08
浏览:505

作为一名软件开发人员,我一直对安全性和可用性的交集着迷。最近,我决定开始一个令人兴奋的项目:使用 Go 创建一个命令行密码管理器。我想与您分享这段旅程的开始,从第一次提交开始。

创世记

2023 年 11 月 27 日,我对我的项目进行了初步提交,我将其命名为“dost”(印地语中的朋友,反映了它作为密码管理的有用伴侣的角色)。这第一步虽然很小,但却为我希望成为一个强大且用户友好的工具奠定了基础。

灵感与愿景

Building a Password Manager in Go

在开始这个项目时,我从流行的命令行密码管理器通行证中汲取了灵感。 pass 的简单性和有效性引起了我的注意,我决定使用它的 API 作为在 Go 中构建我自己的密码管理器的蓝图。

深入研究 pass 的源代码是一次令人大开眼界的经历。我很感兴趣地发现这一广泛使用的工具的全部功能都封装在一个综合的 Bash 脚本中。这种优雅的简单性是我所欣赏的,并希望在我自己的项目中效仿,尽管使用了 Go 的优势。

通过学习 pass,我对命令行密码管理器的基本功能及其应提供的用户体验获得了宝贵的见解。当我继续开发“dost”时,我将牢记这些教训,旨在创建一个将 pass 的简单性与 Go 的性能和跨平台兼容性优势结合起来的工具。

这种探索不仅为要实现的功能提供了路线图,而且增强了我对精心设计、专注的工具的力量的信念。我很高兴看到这种灵感将如何塑造“dost”在未来发展阶段的演变。

第一个特点

最初的提交重点关注两个核心功能:

  1. 密码生成:我实现了一个基本的密码生成器,允许用户指定他们所需的密码长度。此功能旨在创建适合各种安全要求的强随机密码。

  2. 剪贴板集成:为了增强用户体验,我确保生成的密码会自动复制到剪贴板。这个小但重要的功能可以节省时间并降低转录错误的风险。

技术见解

让我们深入探讨第一次迭代的一些技术方面:

  • Go 版本:该项目使用 Go 1.21.0 构建,充分利用了该语言的简单性和高效性。
  • 外部依赖关系:我正在使用 github.com/atotto/clipboard 包来无缝处理不同操作系统之间的剪贴板操作。
  • 随机生成:密码生成利用 Go 的 crypto/rand 包进行安全随机数生成,这对于创建不可预测的强密码至关重要。
  • 字符集:密码生成器包括大小写字母、数字以及各种特殊字符,以保证复杂性。

代码片段

让我们看一下实现的一些关键部分:

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

    allChars := uppercaseLetters   lowercaseLetters   digits   specialChars

    var password string
    for i := 0; i 


此函数通过从预定义集中随机选择字符来创建密码,确保混合使用大写、小写、数字和特殊字符。

  1. 剪贴板集成:
func writeToClipboard(text string) error {
    return clipboard.WriteAll(text)
}

这个简单的函数利用clipboard包将生成的密码写入系统剪贴板。

  1. 主要功能:
func main() {
    passwordLength := flag.Int("length", 12, "length of your password")
    flag.Parse()

    password, err1 := generatePassword(*passwordLength)
    if err1 != nil {
        fmt.Println("Error generating password:", err1)
        return
    }

    fmt.Println("Generated Password:", password)

    err2 := writeToClipboard(password)
    if err2 != nil {
        fmt.Println("Error writing to clipboard:", err2)
        os.Exit(1)
    }

    fmt.Println("Copied to clipboard! ✅\n")
}

主要功能将所有内容联系在一起。它使用Go的flag包来允许用户指定密码长度,生成密码,并将其复制到剪贴板。

命令行界面

正如你在 main 函数中看到的,我使用 Go 的 flag 包实现了一个简单的 CLI。用户可以使用 -length 标志指定所需的密码长度,如果未指定,则默认为 12 个字符。

展望未来

第一次提交只是一个开始。当我继续开发这个密码管理器时,我计划添加以下功能:

  • 密码的安全存储
  • 存储数据加密
  • 搜索和检索功能
  • 密码强度分析

我对未来的旅程及其带来的挑战感到兴奋。构建密码管理器不仅仅涉及编码;还涉及编码。这是关于了解安全原则、用户需求,并创建一个人们可以信任其敏感信息的工具。

随着该项目的发展,请继续关注更多更新。我将分享我一路走来的进步、挑战和经验。如果您有兴趣关注或贡献,请随时查看 GitHub 上的项目。

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

用 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-31jo?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-04-18
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-04-18
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-04-18
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-04-18
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-18
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-04-18
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-04-18
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-04-18
  • React Helmet:React网站头部管理全攻略
    React Helmet:React网站头部管理全攻略
    React头盔:掌握您的React站点的头 直接操纵 document.title 很麻烦且容易出错。 React头盔提供了简化的解决方案。 但是,为了完全利用其功能,尤其是对于SEO(搜索引擎与客户端渲染 content)的努力,SSR是必不可少的。 因此,我们将使用基于React的静态...
    编程 发布于2025-04-18
  • MySQL DATETIME字段高效日期比较方法
    MySQL DATETIME字段高效日期比较方法
    mysql date and dateTime比较比较date-dateTime存储时会带来挑战。考虑数据库表日历,其中开始时间是DateTime字段。基于日期字符串(例如“ 2010-04-29”)选择行需要仔细的处理以相应地匹配DateTime值。 date(&& &&&&& && && &...
    编程 发布于2025-04-18
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-04-18
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-18
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-18
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-04-18
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-04-18

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

Copyright© 2022 湘ICP备2022001581号-3