【问题标题】:Hashing method used in ASP.NET IdentityASP.NET Identity 中使用的散列方法
【发布时间】:2017-01-12 10:51:42
【问题描述】:

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

保存在我的数据库中的密码是使用 ASP.NET 身份进行哈希处理的。虽然用户输入的密码使用 Crypto.HashPassword 进行哈希处理(不知道这个类是否是 ASP.NET Identity 的东西)。

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

[Route("api/Login/Search/{username}/{password}")]

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

AL6kLGQYs3xeCtNkpJuAem43HOEvSpwzSfy5zCK0MviBGuS67Sp+ct0lNfJTd602Uw==

虽然我的数据库中的密码有这个哈希值:

AMlco7zkLpj5alL2MP1VEXQlRbcD2sdTdKB3JvTLzYMMwSUC5vSfhI4MloLLw70Erg==

即使我输入了相同的密码,我也不知道为什么它们的哈希值不同。

如果两个密码匹配,它应该返回'true',否则返回false。我现在处于一个混乱的阶段。希望您能够帮助我。我想知道 ASP.NET Identity 使用什么散列方法?谢谢。

这是我的一些代码。

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;


        }

    }
}

【问题讨论】:

  • 通常密码是加盐的,所以每次生成哈希时它都会不同,即使是相同的密码。这就是为什么你需要知道盐来检查它们的原因。它保存在结果本身中。不能说这些内置系统究竟是如何工作的,但这很可能是原因。
  • @SamiKuhmonen 你在谈论 ASP.NET 身份吗?它是否使用盐方法散列密码?

标签: c# asp.net xamarin xamarin.forms asp.net-identity


【解决方案1】:

Crypto.HashPassword 使用 RFC 2898 并负责为您创建盐

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

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

public static bool VerifyHashedPassword(
     string hashedPassword,
     string password
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2014-02-26
    • 2017-10-30
    相关资源
    最近更新 更多