3 回答
TA贡献1780条经验 获得超5个赞
crypt 非常容易用cgo包装,例如
package main
import (
"fmt"
"unsafe"
)
// #cgo LDFLAGS: -lcrypt
// #define _GNU_SOURCE
// #include <crypt.h>
// #include <stdlib.h>
import "C"
// crypt wraps C library crypt_r
func crypt(key, salt string) string {
data := C.struct_crypt_data{}
ckey := C.CString(key)
csalt := C.CString(salt)
out := C.GoString(C.crypt_r(ckey, csalt, &data))
C.free(unsafe.Pointer(ckey))
C.free(unsafe.Pointer(csalt))
return out
}
func main() {
fmt.Println(crypt("abcdefg", "aa"))
}
运行时会产生这个
aaTcvO819w3js
与python相同 crypt.crypt
>>> from crypt import crypt
>>> crypt("abcdefg","aa")
'aaTcvO819w3js'
>>>
TA贡献2039条经验 获得超7个赞
我认为,目前没有任何公开的Go软件包可实现基于Unix的“加盐” DES的老式crypt()
功能。这与在"crypto/des"
软件包中实现的常规对称DES加密/解密(您已经发现)不同。
您将必须自己实施。有许多不同语言(大多数为C)的现有实现,例如FreeBSD源代码或glibc中的实现。如果您在Go中实现它,请发布它。:)
对于新项目,最好使用一些更强大的密码哈希算法,例如bcrypt。go.crypto存储库中提供了一个很好的实现。该文档可在此处获得。不幸的是,如果您需要使用预先存在的旧密码哈希,这将无济于事。
编辑添加:我看了一下Python的crypt.crypt()
实现,发现它只是libc实现的包装。为Go实现相同的包装很简单。但是,将Python实现与Go实现进行比较的想法已经毁了:您必须自己实现两个实现,才能进行有意义的比较。
TA贡献1858条经验 获得超8个赞
例如
package main
import (
"crypto/des"
"fmt"
"log"
)
func main() {
b, err := des.NewCipher([]byte("abcdefgh"))
if err != nil {
log.Fatal(err)
}
msg := []byte("Hello!?!")
fmt.Printf("% 02x: %q\n", msg, msg)
b.Encrypt(msg, msg)
fmt.Printf("% 02x: %q\n", msg, msg)
b.Decrypt(msg, msg)
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!?!"
- 3 回答
- 0 关注
- 238 浏览
添加回答
举报