我在Xamarin.Forms Portable应用程序中创建了一个登录表单。我有一个WebFormsProject,其中我创建了一个API控制器,用于比较用户输入的用户名和密码与我的数据库中保存的用户名和密码。
我的数据库保存的密码是使用ASP.NET标识进行哈希处理的。虽然使用Crypto.HashPassword对用户输入的密码进行哈希处理(不知道这个类是否是ASP.NET身份)。
我测试它以输入我的用户名和密码:
〔路线(" API /登录/搜索/ {用户名} / {密码}&#34)]
当我使用断点来尝试密码中我的密钥的哈希值时,我得到了这个:
AL6kLGQYs3xeCtNkpJuAem43HOEvSpwzSfy5zCK0MviBGuS67Sp + ct0lNfJTd602Uw ==
虽然我的数据库中的密码具有此哈希值:
AMlco7zkLpj5alL2MP1VEXQlRbcD2sdTdKB3JvTLzYMMwSUC5vSfhI4MloLLw70Erg ==
即使我已输入相同的密码,我也不知道为什么他们有不同的哈希值。
如果两个密码匹配,则应返回' true'否则是假的。我现在处于一个令人困惑的阶段。希望您能够帮助我。我想知道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;
}
}
}
答案 0 :(得分:2)
Crypto.HashPassword使用RFC 2898并负责为您创建一个盐
密码哈希是使用RFC 2898算法使用128位盐,256位子密钥和1000次迭代生成的。生成的哈希字节流的格式为{0x00,salt,subkey},在返回之前进行base-64编码。
您必须使用Crypto.VerifyHashedPassword来比较密码
public static bool VerifyHashedPassword(
string hashedPassword,
string password
)