linux密码算法-003
003
3.1 linux密码算法粗解
linux 密码文件在:/etc/shadow
// 示例
admin:$6$6swiWjq7$1eai7fYqykh38CUOjSmMBOb60MfIaqJLwADRqjThJpKMlJvabA27NnCsQ4v9MSI74J7.GpNGunnblwi/cG28V1:19097:0:99999:7::
上述示例密码为:$6$6swiWjq7$1eai7fYqykh38CUOjSmMBOb60MfIaqJLwADRqjThJpKMlJvabA27NnCsQ4v9MSI74J7.GpNGunnblwi/cG28V1
解析结果为:
加密盐(salt-前11位):$6$6swiWjq7
加密算法标识为(第2位):6
linux 密码算法有:
ID | Method
--------------------------
1 | MD5
2a | Blowfish (not in mainline glibc; added in some Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
3.2 Go具体实现
使用拓展包:“github.com/GehirnInc/crypt”
具体实现:
import (
"errors"
"github.com/GehirnInc/crypt"
_ "github.com/GehirnInc/crypt/md5_crypt"
_ "github.com/GehirnInc/crypt/sha256_crypt"
_ "github.com/GehirnInc/crypt/sha512_crypt"
"strings"
)
func Crypt(salt, password string) (string, error) {
infos := strings.Split(salt, "$")
var ct crypt.Crypter
switch infos[1] {
case "1":
ct = crypt.MD5.New()
case "5":
ct = crypt.SHA256.New()
case "6":
ct = crypt.SHA512.New()
default:
return "", errors.New("不支持当前加密类型,type=" + infos[1])
}
return ct.Generate([]byte(password), []byte(salt))
}