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條經驗 獲得超8個贊
我認為,目前沒有任何公開的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 關注
- 295 瀏覽
添加回答
舉報