什么是Go相当于Python的crypt.crypt?

时间:2013-01-01 11:11:32

标签: python go des crypt

我目前正在玩一本名为Violent Python的例子。您可以看到我的实施here

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

import "crypto/des"
des.NewCipher([]byte("abcdefgh"))

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

编辑: Python docs for crypt.crypt

4 个答案:

答案 0 :(得分:3)

我相信目前还没有任何公开的Go软件包可以实现老式的Unix“盐渍”DES crypt()功能。这与"crypto/des"包中实现的正常对称DES加密/解密不同(正如您所发现的那样)。

您必须自己实施。不同语言中存在大量现有实现(主要是C),例如FreeBSD sourcesglibc。如果你在Go中实现它,请发布它。 :)

对于新项目,使用更强大的密码哈希算法(例如bcrypt)要好得多。 go.crypto存储库中提供了一个很好的实现。该文档可用here。不幸的是,如果您需要使用预先存在的旧密码哈希值,这无济于事。

编辑添加:我查看了Python的crypt.crypt()实现,发现它只是libc实现的包装器。为Go实现相同的包装器会很简单。但是,您将Python实现与Go实现进行比较的想法已经破坏:您必须自己实现两者以进行任何有意义的比较。

答案 1 :(得分:3)

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'
>>> 

(更新为免费提供CStrings - 感谢@ james-henstridge)

答案 2 :(得分:2)

E.g。

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 :(得分:2)

好消息!实际上是你正在寻找的开源实现。 Osutil有一个加密包,可以在纯Go中重新实现crypt

https://github.com/kless/osutil/tree/master/user/crypt