首页 文章

ASP.NET身份中使用的哈希方法

提问于
浏览
1

我正在Xamarin.Forms Portable应用程序中创建一个登录表单 . 我有一个WebFormsProject,其中我创建了一个API控制器,用于比较用户键入的用户名和密码与我的数据库中保存的用户名和密码 .

保存在我的数据库中的密码是使用ASP.NET标识进行哈希处理的 . 虽然将使用Crypto.HashPassword对用户键入的密码进行哈希处理(不知道此类是否为ASP.NET标识) .

我测试它输入我的用户名和密码使用这个:

[Route("api/Login/Search//")]

当我使用断点来尝试密码中我的密钥的哈希值时,我得到了这个:

AL6kLGQYs3xeCtNkpJuAem43HOEvSpwzSfy5zCK0MviBGuS67Sp+ct0lNfJTd602Uw==

虽然我的数据库中的密码具有此哈希值:

AMlco7zkLpj5alL2MP1VEXQlRbcD2sdTdKB3JvTLzYMMwSUC5vSfhI4MloLLw70Erg==

我没有't know why they have different Hashed value even if I'已进入 SAME PASSWORD.

如果两个密码匹配,则应返回“true”,否则为false . 我现在处于一个令人困惑的阶段 . 希望您能够帮助我 . 我想知道ASP.NET身份使用的散列方法是什么?谢谢 .

这是我的一些代码 .

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using WebFormsDemo;
using WebFormsDemo.ViewModel;
using System.Security.Cryptography;
using System.Web.Helpers;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.EntityFramework;


namespace WebFormsDemo.Controllers
{
    public class LoginController : ApiController
    {
        private EBMSEntities db = new EBMSEntities();


        [Route("api/Login/Search/{username}/{password}")]
        [ResponseType(typeof(List<AspNetUser>))]



        public bool getUserPassword(string username, string password)

        {

            var hashedPassword = "";
            hashedPassword = Crypto.HashPassword(password);


            var user = (from u in db.AspNetUsers
                        where u.UserName.Equals(username)
                        && u.PasswordHash.Equals(hashedPassword)
                        select u).ToList();


            if (user.Count() != 0)
            {
                return true;
            }

            return false;


        }

    }
}

1 回答

  • 2

    Crypto.HashPassword使用RFC 2898并负责为您创建一个salt

    密码哈希是使用RFC 2898算法使用128位盐,256位子密钥和1000次迭代生成的 . 生成的哈希字节流的格式为{0x00,salt,subkey},在返回之前进行base-64编码 .

    您必须使用Crypto.VerifyHashedPassword来比较密码

    public static bool VerifyHashedPassword(
         string hashedPassword,
         string password
    )
    

相关问题