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)
}
}
注意事项
- 使用HIBP API时请遵守其使用条款
- 对于生产环境应用,建议获取并使用API密钥
- 检查密码时,建议使用k-匿名技术(如上面的哈希前缀检查示例)来保护用户隐私
更多详细用法和API参考,请查看库的GoDoc文档。
更多关于golang检测密码是否在数据泄露库中的插件库go-hibp的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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)
}
}
}
最佳实践
-
不要直接发送明文密码:在生产环境中,建议使用哈希前缀方法(第二个示例)而不是直接发送明文密码。
-
处理速率限制:HIBP API 有速率限制,如果需要大量查询,请考虑添加延迟或使用官方API密钥。
-
用户友好反馈:当发现密码泄露时,向用户提供明确的反馈和建议更改密码。
-
本地缓存:对于频繁检查的密码,可以考虑在本地缓存结果以减少API调用。
go-hibp 库提供了一种简单有效的方式来增强应用程序的安全性,通过检查用户密码是否出现在已知的泄露库中,可以帮助防止使用已被泄露的弱密码。