代码之家  ›  专栏  ›  技术社区  ›  Juned Ansari

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

  •  11
  • Juned Ansari  · 技术社区  · 6 年前

    我现有的Ap.NET C语言网站正在与MySQL数据库一起工作。现在我计划为那个网站创建移动应用程序,因为这个API需要准备好。 我正在为PHP Laravel框架创建一个API。对于注册API需要生成密码。

    使用其内置库生成类似密码的

    WebSecurity.CreateUserAndAccount("username", "password");
    

    它会自动在名为“webpages\u 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);
        }
    
    }
    

    我已经成功地在PHP中创建了登录APi,使用上述类可以很好地工作。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Kit Grose    6 年前

    所有的评论都告诉你,你 可能 如果您尝试将此工作移植到PHP,而不是让PHP通过某些.NET组件与后端进行通信,那么这样做会很困难。

    不过,如果你打算把它移植过来, the code for WebSecurity.CreateUserAndAccount() is available on GitHub . 如您所见,它依赖于当前配置的成员资格提供程序对该方法的实现。

    为了 SimpleMembershipProvider , the implementation is very simple . 重要的一点是:

    CreateUserRow(db, userName, values);
    return CreateAccount(userName, password, requireConfirmation);
    

    CreateUserRow() 不是很有趣也不奇怪,但是 CreateAccount() 对我认为你关心的部分负责。

    有两个部分需要移植到PHP; Crypto.HashPassword() GenerateToken() . 既然你打电话来 WebSecurity.CreateUserAndAccount() 只有两个参数,您可以忽略 生成令牌() 部分(自 requireConfirmation 默认为 false ).

    Here's the source code for Crypto.HashPassword() . 根据其评论,它执行:

    PBKDF2与HMAC-SHA1,128位盐,256位子密钥,1000次迭代。
    (另请参见:SDL crypto guidelines v5.1,Part III)
    格式: { 0x00, salt, subkey }

    使用 System.Security.Cryptography.Rfc2898DeriveBytes() 方法。

    这让我们 this directly related existing Stack Overflow answer ,而我 认为 给你想要的。