golang检测密码是否在数据泄露库中的插件库go-hibp的使用

Golang检测密码是否在数据泄露库中的插件库go-hibp的使用

go-hibp是一个简单的Go语言绑定库,用于访问"Have I Been Pwned"(HIBP) API。它实现了HIBP提供的所有3个API接口(Breaches, Pastes, Passwords),并支持私有API端点的API密钥认证。

功能特点

  • 实现了HIBP的所有3个API接口
  • 支持API密钥认证
  • 遵循Go语言的惯用风格和最佳实践
  • 仅依赖于Go标准库和niljson包

安装

使用go get命令安装go-hibp库:

go get github.com/wneessen/go-hibp

使用示例

检测密码是否在泄露数据库中

package main

import (
	"fmt"
	"log"

	"github.com/wneessen/go-hibp"
)

func main() {
	// 创建一个新的HIBP客户端
	client := hibp.NewClient()

	// 要检查的密码
	password := "password123"

	// 检查密码是否在泄露数据库中
	count, err := client.PwnedPasswords.Compromised(password)
	if err != nil {
		log.Fatalf("查询密码泄露状态失败: %v", err)
	}

	// 输出结果
	if count > 0 {
		fmt.Printf("警告: 密码 '%s' 已在 %d 次数据泄露中出现过\n", password, count)
	} else {
		fmt.Printf("好消息: 密码 '%s' 未在已知的数据泄露中出现\n", password)
	}
}

使用API密钥访问私有端点

package main

import (
	"fmt"
	"log"

	"github.com/wneessen/go-hibp"
)

func main() {
	// 创建一个新的HIBP客户端并设置API密钥
	client := hibp.NewClient()
	client.SetAPIKey("your-api-key-here")

	// 检查指定邮箱账户的泄露情况
	breaches, err := client.Breaches.Account("test@example.com", nil)
	if err != nil {
		log.Fatalf("查询账户泄露信息失败: %v", err)
	}

	// 输出泄露信息
	if len(breaches) > 0 {
		fmt.Printf("账户已出现在 %d 次数据泄露中:\n", len(breaches))
		for _, b := range breaches {
			fmt.Printf("- %s (%s)\n", b.Title, b.BreachDate)
		}
	} else {
		fmt.Println("好消息: 账户未出现在任何已知的数据泄露中")
	}
}

检查密码哈希前缀

package main

import (
	"fmt"
	"log"

	"github.com/wneessen/go-hibp"
)

func main() {
	// 创建一个新的HIBP客户端
	client := hibp.NewClient()

	// 要检查的密码SHA1哈希的前5个字符
	hashPrefix := "5BAA6"

	// 获取匹配该前缀的所有密码哈希
	hashes, err := client.PwnedPasswords.HashesByPrefix(hashPrefix)
	if err != nil {
		log.Fatalf("查询哈希前缀失败: %v", err)
	}

	// 输出结果
	fmt.Printf("找到 %d 个匹配哈希前缀 '%s' 的密码\n", len(hashes), hashPrefix)
	for suffix, count := range hashes {
		fmt.Printf("- %s%s: %d 次\n", hashPrefix, suffix, count)
	}
}

注意事项

  1. 使用HIBP API时请遵守其使用条款
  2. 对于生产环境应用,建议获取并使用API密钥
  3. 检查密码时,建议使用k-匿名技术(如上面的哈希前缀检查示例)来保护用户隐私

更多详细用法和API参考,请查看库的GoDoc文档。


更多关于golang检测密码是否在数据泄露库中的插件库go-hibp的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang检测密码是否在数据泄露库中的插件库go-hibp的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-hibp检测密码是否在数据泄露库中

go-hibp 是一个用于检查密码是否出现在 Have I Been Pwned (HIBP) 数据泄露库中的 Go 语言库。HIBP 是一个著名的数据泄露查询服务,收集了各种大规模数据泄露事件中的密码和账户信息。

安装

首先安装 go-hibp 库:

go get github.com/wneessen/go-hibp

基本使用方法

1. 检查密码是否在泄露库中

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/wneessen/go-hibp"
)

func main() {
	// 创建新的HIBP客户端
	client := hibp.New()

	// 要检查的密码
	password := "password123"

	// 检查密码是否在泄露库中
	count, err := client.PwnedPassword.Check(password)
	if err != nil {
		log.Fatalf("检查密码失败: %v", err)
	}

	if count > 0 {
		fmt.Printf("警告: 该密码已出现在 %d 次数据泄露中\n", count)
	} else {
		fmt.Println("该密码未出现在已知的泄露库中")
	}
}

2. 使用SHA-1哈希前缀检查(更安全的方式)

为了更安全地检查密码而不直接发送明文密码,可以使用k-匿名方法:

package main

import (
	"fmt"
	"log"

	"github.com/wneessen/go-hibp"
)

func main() {
	client := hibp.New()

	password := "password123"
	
	// 获取密码的SHA-1哈希前缀
	prefix, suffix, err := hibp.PwnedPasswordHash(password)
	if err != nil {
		log.Fatalf("生成哈希失败: %v", err)
	}

	// 使用前缀查询
	result, err := client.PwnedPassword.ByHashPrefix(prefix)
	if err != nil {
		log.Fatalf("查询失败: %v", err)
	}

	// 检查后缀是否在结果中
	count := result.GetSuffixCount(suffix)
	if count > 0 {
		fmt.Printf("警告: 该密码已出现在 %d 次数据泄露中\n", count)
	} else {
		fmt.Println("该密码未出现在已知的泄露库中")
	}
}

高级配置

1. 设置自定义HTTP客户端和超时

package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/wneessen/go-hibp"
)

func main() {
	// 创建自定义HTTP客户端
	httpClient := &http.Client{
		Timeout: 10 * time.Second,
	}

	// 使用自定义HTTP客户端创建HIBP客户端
	client := hibp.New(
		hibp.WithHTTPClient(httpClient),
		hibp.WithUserAgent("my-security-app/1.0"),
	)

	// 使用客户端进行检查...
}

2. 批量检查多个密码

package main

import (
	"fmt"
	"log"

	"github.com/wneessen/go-hibp"
)

func main() {
	client := hibp.New()

	passwords := []string{"password123", "qwerty", "securePass123"}

	for _, pwd := range passwords {
		count, err := client.PwnedPassword.Check(pwd)
		if err != nil {
			log.Printf("检查密码 %s 失败: %v", pwd, err)
			continue
		}

		if count > 0 {
			fmt.Printf("密码 '%s' 已出现在 %d 次泄露中\n", pwd, count)
		} else {
			fmt.Printf("密码 '%s' 是安全的\n", pwd)
		}
	}
}

最佳实践

  1. 不要直接发送明文密码:在生产环境中,建议使用哈希前缀方法(第二个示例)而不是直接发送明文密码。

  2. 处理速率限制:HIBP API 有速率限制,如果需要大量查询,请考虑添加延迟或使用官方API密钥。

  3. 用户友好反馈:当发现密码泄露时,向用户提供明确的反馈和建议更改密码。

  4. 本地缓存:对于频繁检查的密码,可以考虑在本地缓存结果以减少API调用。

go-hibp 库提供了一种简单有效的方式来增强应用程序的安全性,通过检查用户密码是否出现在已知的泄露库中,可以帮助防止使用已被泄露的弱密码。

回到顶部