zel*_*con 0 binary byte bytearray go
我以为x := make([]byte, N)
应该定义一个N字节的片段.我得到0x015f82a975f9752b作为输出,在基数2中是:
0001 0101 1111 1000 0010 1010 1001 0111 0101 1111 1001 0111 0101 0010 1011
不是8. 我错过了什么?
请参阅genSalt()
下面的功能及其输出.
package main
import (
"crypto/rand"
"crypto/sha256"
"fmt"
"golang.org/x/crypto/pbkdf2"
"log"
)
// generate a salt with N random bytes
func genSalt() []byte {
ret := make([]byte, 8) // N == 8 (..right?)
_, err := rand.Read(ret)
if err != nil {
log.Fatal(err)
}
return ret
}
// pbkdf2 with sha256
// returns sha256.Size == 32 bytes
func hashPassword(cleartext, salt []byte) []byte {
return pbkdf2.Key([]byte(cleartext), salt, 4096, sha256.Size, sha256.New)
}
func main() {
password := "GNUsNotUnixItsWorse"
salt := genSalt()
hashed := hashPassword([]byte(password), salt)
fmt.Printf("sha256: %x\n", hashed)
fmt.Printf("salt: %x\n", salt)
fmt.Println("len(salt)", len(salt),
"\nlen(hashed)", len(hashed))
// OUTPUT (sample):
// sha256: b9c314c8fb8d183fb8773b8b2e2b2b991927915adeba44eb51c8fe6f9e13ee09
// salt: 015f82a975f9752b
// len(salt) 8
// len(hashed) 32
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这在Go Playground中不起作用,因此只需在本地运行即可.
(对不起,如果这是一个迟钝的问题;我被剥夺了睡眠.)
1字节= 8位.
你的输出:0x015f82a975f9752b
.那恰好是8个字节.
1个字节可以显示为2个十六进制数字(1个十六进制数字包含4位,因此1个字节= 8位= 2个十六进制数字).
当您将其呈现为二进制时:
binary: 0001 0101 1111 1000 0010 1010 1001 0111 0101 1111 1001 0111 0101 0010 1011
hex: 1 | 5 | f | 8 | 2 | a | 9 | 7 | 5 | f | 9 | 7 | 5 | 2 | b |
byte idx: 7. | 6. | 5. | 4. | 3. | 2. | 1. | 0. |
Run Code Online (Sandbox Code Playgroud)
这是60位,因为前4位是0并且没有打印.64位= 8个字节.