golang读取用户名和密码文件并生成笛卡尔积
密码爆破时需要读取用户名字典和密码字典来生成笛卡尔积派发爆破任务;直接读取全部字典内容到内存时成本较高;
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 打开1.txt文件
file1, err := os.Open("1.txt")
if err != nil {
fmt.Println("无法打开文件1.txt: ", err)
return
}
defer file1.Close()
// 打开2.txt文件
file2, err := os.Open("2.txt")
if err != nil {
fmt.Println("无法打开文件2.txt: ", err)
return
}
defer file2.Close()
// 读取1.txt文件中的每一行作为用户名,逐行读取
scanner1 := bufio.NewScanner(file1)
for scanner1.Scan() {
user := scanner1.Text()
// 读取2.txt文件中的每一行作为密码,逐行读取并输出结果
scanner2 := bufio.NewScanner(file2)
for scanner2.Scan() {
password := scanner2.Text()
fmt.Printf("username: %s, password: %s\n", user, password)
}
file2.Seek(0, 0)
}
}
使用了逐行读取的方式来读取1.txt和2.txt文件的内容,这样可以避免将整个文件读入内存。在计算笛卡尔积时,我们直接在内部循环中输出结果,而不必将结果存储到一个切片中。另外,为了让内部循环能够重复使用2.txt文件,我们在每次循环结束后使用 file2.Seek(0, 0)
将文件指针重置到文件开始位置。