Go等同于Python的crypt.crypt?

我目前正在玩《暴力Python》一书中的示例。你可以在这里看到我的实现


我现在正在尝试在Go中实现相同的脚本以比较性能,请注意,我对Go来说是全新的。打开文件并遍历各行很好,但是我无法弄清楚如何使用“ crypto”库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行哈希处理。我想可能是这样的


import "crypto/des"

des.NewCipher([]byte("abcdefgh"))

但是,没有雪茄。任何帮助将不胜感激,因为将Go的并行性能与Python的多线程进行比较非常有趣。


一只斗牛犬
浏览 239回答 3
3回答

翻阅古今

crypt 非常容易用cgo包装,例如package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "unsafe")// #cgo LDFLAGS: -lcrypt// #define _GNU_SOURCE// #include <crypt.h>// #include <stdlib.h>import "C"// crypt wraps C library crypt_rfunc crypt(key, salt string) string {&nbsp; &nbsp; data := C.struct_crypt_data{}&nbsp; &nbsp; ckey := C.CString(key)&nbsp; &nbsp; csalt := C.CString(salt)&nbsp; &nbsp; out := C.GoString(C.crypt_r(ckey, csalt, &data))&nbsp; &nbsp; C.free(unsafe.Pointer(ckey))&nbsp; &nbsp; C.free(unsafe.Pointer(csalt))&nbsp; &nbsp; return out}func main() {&nbsp; &nbsp; fmt.Println(crypt("abcdefg", "aa"))}运行时会产生这个aaTcvO819w3js与python相同 crypt.crypt>>> from crypt import crypt>>> crypt("abcdefg","aa")'aaTcvO819w3js'>>>&nbsp;

largeQ

我认为,目前没有任何公开的Go软件包可实现基于Unix的“加盐” DES的老式crypt()功能。这与在"crypto/des"软件包中实现的常规对称DES加密/解密(您已经发现)不同。您将必须自己实施。有许多不同语言(大多数为C)的现有实现,例如FreeBSD源代码或glibc中的实现。如果您在Go中实现它,请发布它。:)对于新项目,最好使用一些更强大的密码哈希算法,例如bcrypt。go.crypto存储库中提供了一个很好的实现。该文档可在此处获得。不幸的是,如果您需要使用预先存在的旧密码哈希,这将无济于事。编辑添加:我看了一下Python的crypt.crypt()实现,发现它只是libc实现的包装。为Go实现相同的包装很简单。但是,将Python实现与Go实现进行比较的想法已经毁了:您必须自己实现两个实现,才能进行有意义的比较。

猛跑小猪

例如package mainimport (&nbsp; &nbsp; &nbsp; &nbsp; "crypto/des"&nbsp; &nbsp; &nbsp; &nbsp; "fmt"&nbsp; &nbsp; &nbsp; &nbsp; "log")func main() {&nbsp; &nbsp; &nbsp; &nbsp; b, err := des.NewCipher([]byte("abcdefgh"))&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; msg := []byte("Hello!?!")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("% 02x: %q\n", msg, msg)&nbsp; &nbsp; &nbsp; &nbsp; b.Encrypt(msg, msg)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("% 02x: %q\n", msg, msg)&nbsp; &nbsp; &nbsp; &nbsp; b.Decrypt(msg, msg)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("% 02x: %q\n", msg, msg)}(也:http : //play.golang.org/p/czYDRjtWNR)输出:48 65 6c 6c 6f 21 3f 21: "Hello!?!"3e 41 67 99 2d 9a 72 b9: ">Ag\x99-\x9ar\xb9"48 65 6c 6c 6f 21 3f 21: "Hello!?!"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go