如何使用PHP生成ASP.NET密码

Jun*_*ari 11 php c# asp.net

我现有的ap.net c#网站正在使用mysql数据库.现在我打算为该网站创建移动应用程序,因为该API需要做好准备.我正在PHP Laravel Framework中创建一个API.对于RegistrationAPI需要生成密码.

Asp.net使用其内置库生成密码之类的

WebSecurity.CreateUserAndAccount("username", "password");
Run Code Online (Sandbox Code Playgroud)

它会在名为"webpages_membership"的表中自动生成密码

注意:我使用的是aps.net工作网站使用的相同数据库.所以我的网站将在asp.net,api现在将在php中.

我在php中找到了MembershipModel类,用于比较两个密码,但它无法生成密码.

<?php

/*
 * Author  : Mr. Juned Ansari
 * Date    : 15/02/2017 
 * Purpose : It Handles Login Encryption And Decryption Related Activities
 */

class MembershipModel {

    function bytearraysequal($source, $target) {
        if ($source == null || $target == null || (strlen($source) != strlen($target)))
            return false;
        for ($ctr = 0; $ctr < strlen($target); $ctr++) {
            if ($target[$ctr] != $source[$ctr])
                return false;
        }
        return true;
    }
    //This Function is Used to verifypassword
    function verifypassword($hashedPassword, $password) {

        $PBKDF2IterCount = 1000; // default for Rfc2898DeriveBytes
        $PBKDF2SubkeyLength = 32; // 256 bits       
        $SaltSize = 16; // 128 bits


        if ($hashedPassword == null) {
            return false;
            //show_error("hashedPassword is null");
        }
        if ($password == null) {
            return false;
            //show_error("Password is null");
        }

        $hashedPasswordBytes = base64_decode($hashedPassword);

        if (strlen($hashedPasswordBytes) != 48) {
            return false;
        }

        $salt = substr($hashedPasswordBytes, 0, $SaltSize);

        $storedSubkey = substr($hashedPasswordBytes, $SaltSize, $PBKDF2SubkeyLength);

        $generatedSubkey = $this->encript('sha1', $password, $salt, $PBKDF2IterCount, $PBKDF2SubkeyLength, true);

        return $this->bytearraysequal($storedSubkey, $generatedSubkey);
    }

    function encript($algorithm, $password, $salt, $count, $key_length, $raw_output = false) {
        $algorithm = strtolower($algorithm);
        if (!in_array($algorithm, hash_algos(), true))
            return false;
        //show_error('PBKDF2 ERROR: Invalid hash algorithm.');
        if ($count <= 0 || $key_length <= 0)
            return false;
        //show_error('PBKDF2 ERROR: Invalid parameters.');

        $hash_length = strlen(hash($algorithm, "", true));
        $block_count = ceil($key_length / $hash_length);

        $output = "";
        for ($i = 1; $i <= $block_count; $i++) {

            $last = $salt . pack("N", $i);

            $last = $xorsum = hash_hmac($algorithm, $last, $password, true);

            for ($j = 1; $j < $count; $j++) {
                $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
            }
            $output .= $xorsum;
        }
        return substr($output, 0, $key_length);
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经在PHP中成功创建了Login APi,使用上面的类可以正常工作.

Kit*_*ose 5

正如所有评论都建议你的那样,如果你试图将这项工作移植到PHP而不是让PHP通过某些.NET组件与后端通信,那么你可能正在努力做到这一点.

尽管如此,如果您已将其移植,则可以在GitHub上获取代码WebSecurity.CreateUserAndAccount().如您所见,它依赖于当前配置的成员资格提供程序对该方法的实现.

因为SimpleMembershipProvider,实现非常简单.这是重要的一点:

CreateUserRow(db, userName, values);
return CreateAccount(userName, password, requireConfirmation);
Run Code Online (Sandbox Code Playgroud)

CreateUserRow()不是很有趣或令人惊讶,但是CreateAccount()对我认为你关心的部分负责.

您需要将两个部分移植到PHP; Crypto.HashPassword()GenerateToken().由于您WebSecurity.CreateUserAndAccount()只使用两个参数进行调用,因此可以忽略该GenerateToken()部分(因为requireConfirmation默认为false).

这是源代码Crypto.HashPassword().根据其评论,它执行:

PBKDF2具有HMAC-SHA1,128位盐,256位子密钥,1000次迭代.
(另请参阅:SDL加密指南v5.1,第III部分)
格式:{ 0x00, salt, subkey }

......使用这种System.Security.Cryptography.Rfc2898DeriveBytes()方法.

这导致我们直接相关的现有Stack Overflow答案,我认为这会给你你想要的东西.