为了账号安全,请及时绑定邮箱和手机立即绑定

Go等同于Python的crypt.crypt?

Go等同于Python的crypt.crypt?

Go
一只斗牛犬 2021-05-13 22:02:16
我目前正在玩《暴力Python》一书中的示例。你可以在这里看到我的实现我现在正在尝试在Go中实现相同的脚本以比较性能,请注意,我对Go来说是全新的。打开文件并遍历各行很好,但是我无法弄清楚如何使用“ crypto”库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行哈希处理。我想可能是这样的import "crypto/des"des.NewCipher([]byte("abcdefgh"))但是,没有雪茄。任何帮助将不胜感激,因为将Go的并行性能与Python的多线程进行比较非常有趣。
查看完整描述

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'

>>> 


查看完整回答
反对 回复 2021-05-24
?
largeQ

TA贡献2039条经验 获得超7个赞

我认为,目前没有任何公开的Go软件包可实现基于Unix的“加盐” DES的老式crypt()功能。这与在"crypto/des"软件包中实现的常规对称DES加密/解密(您已经发现)不同。

您将必须自己实施。有许多不同语言(大多数为C)的现有实现,例如FreeBSD源代码glibc中的实现。如果您在Go中实现它,请发布它。:)

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

编辑添加:我看了一下Python的crypt.crypt()实现,发现它只是libc实现的包装。为Go实现相同的包装很简单。但是,将Python实现与Go实现进行比较的想法已经毁了:您必须自己实现两个实现,才能进行有意义的比较。


查看完整回答
反对 回复 2021-05-24
?
猛跑小猪

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!?!"


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信