下列截取自cloudreve开源版3.8.0源码 models\user.go:209
func (user *User) CheckPassword(password string) (bool, error) {
// 根据存储密码拆分为 Salt 和 Digest
passwordStore := strings.Split(user.Password, ":")
if len(passwordStore) != 2 && len(passwordStore) != 3 {
return false, errors.New("Unknown password type")
}
// 兼容V2密码,升级后存储格式为: md5:$HASH:$SALT
if len(passwordStore) == 3 {
if passwordStore[0] != "md5" {
return false, errors.New("Unknown password type")
}
hash := md5.New()
_, err := hash.Write([]byte(passwordStore[2] + password))
bs := hex.EncodeToString(hash.Sum(nil))
if err != nil {
return false, err
}
return bs == passwordStore[1], nil
}
//计算 Salt 和密码组合的SHA1摘要
hash := sha1.New()
_, err := hash.Write([]byte(password + passwordStore[0]))
bs := hex.EncodeToString(hash.Sum(nil))
if err != nil {
return false, err
}
return bs == passwordStore[1], nil
}
通过代码可以获得password在数据库中是两/三段式
以PHP为例可以写出下列代码来效验输入的明文密码是否正确
这里提供一段V2 password 明文密码为a123456 mA0SdDBz1oR2mRSn:f475cf0ca1a64ffe42f9b3e0a239df7a915121a7
/***
* CheckPassword()
* @zifsy
* 2023-07-20
* 根据明文校验密码
* $user array 用户信息数组
* $password string 用户输入明文密码
***/
function CheckPassword($user,$password){
$passwordStore = explode( ":",$user['password']);
if(count($passwordStore) !=2 && count($passwordStore) !=3){
return false;//数据库中存储的密码有错
}
if(count($passwordStore) ==3){
if ($passwordStore[0] != 'md5'){
return false;//数据库中存储的密码校验有错
}
$hash = md5($passwordStore[2].$password);
if($hash==$passwordStore[1]){
return true;
}else{
return false;//密码验证失败
}
}
$hash = sha1($password + $passwordStore[0]);
if($hash==$passwordStore[1]){
return true;
}else{
return false;//密码验证失败
}
}