cloudreve的明文校验密码
下列截取自cloudreve开源版3.8.0源码 modelsuser.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;//密码验证失败
    }
}

本文转载自:https://www.0uu.cc/archives/179/

最后修改:2023 年 07 月 20 日
如果觉得我的文章对你有用,请随意赞赏