C#PCL HMACSHAX与BouncyCastle-PCL

时间:2015-06-22 08:06:22

标签: c# bouncycastle portable-class-library

我想在便携式C#类中实现这个逻辑:

public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (MembershipService.ValidateUser(model.UserName, model.Password))
        {
            SetupFormsAuthTicket(model.UserName, model.RememberMe, model.Password);

            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            return RedirectToAction("Index", "Home");
        }

        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

但便携式中不存在public void UpdateUser(User user) { var usrEntry = Users.FirstOrDefault(x => x.UserId == user.UserId); usrEntry.IsActive = user.IsActive; usrEntry.Block = user.Block; SaveChanges(); var data = GetRolesDb(); } static JsonWebToken() { HashAlgorithms = new Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>> { { JwtHashAlgorithm.HS256, (key, value) => { using (var sha = new HMACSHA256(key)) { return sha.ComputeHash(value); } } }, { JwtHashAlgorithm.HS384, (key, value) => { using (var sha = new HMACSHA384(key)) { return sha.ComputeHash(value); } } }, { JwtHashAlgorithm.HS512, (key, value) => { using (var sha = new HMACSHA512(key)) { return sha.ComputeHash(value); } } } }; } HMACSHA256 库。

首先我尝试使用https://github.com/AArnott/PCLCrypto 但我总是得到:HMACSHA384

我检查了代码然后我看到Crpyto for PCL没有实现并且总是抛出异常

然后我找到了这个库: https://github.com/onovotny/BouncyCastle-PCL

但是没有文档如何使用它。有人可以给我一个例子来实现

HMACSHA512

使用BouncyCastle-PCL。

2 个答案:

答案 0 :(得分:4)

HmacSha256

尝试这样做
public class HmacSha256
    {
        private readonly HMac _hmac;

        public HmacSha256(byte[] key)
        {
            _hmac = new HMac(new Sha256Digest());
            _hmac.Init(new KeyParameter(key));
        }

        public byte[] ComputeHash(byte[] value)
        {
            if (value == null) throw new ArgumentNullException("value");

            byte[] resBuf = new byte[_hmac.GetMacSize()];
            _hmac.BlockUpdate(value, 0, value.Length);
            _hmac.DoFinal(resBuf, 0);

            return resBuf;
        }
    }

其他两个应该是同样的......

答案 1 :(得分:0)

这只是一个跟进,因为它出现在Google上。 PCLCrypto库确实实现了所有哈希方法,但不在PCL dll中实现。 PCL dll只是一个存根,实际的实现是在特定于平台的DLL中。

请确保您从所有项目中引用PCLCrypto库,而不仅仅是PCL库。

该技术称为诱饵和开关,因为它允许最终应用程序使用系统特定的加密apis(以提高性能)

请参阅https://github.com/AArnott/PCLCrypto#installation