.Net中的AES + HMAC加密

战争

我正在尝试序列化和加密简单的dto,以安全地将它们作为字符串传递。

似乎大多数人在问这个问题时都将我指向“加密并解密字符串”@jbtule花了一些时间提供了一个非常详细的答案,并提供了两种可能的解决方案。

我已经从他的要旨https://gist.github.com/jbtule/4336842#file-aesthenhmac-cs(名为“ AESThenHMAC.cs”的文件)中复制了第二个示例,并将其放入我的项目中。

然后,我认为总结并快速测试此解决方案可能是一个好习惯,但我似乎无法使其正常工作。

有人可以在这里解释我做错了什么吗?

这是我的包装器回合@jbtule的代码:

using Newtonsoft.Json;
using System.Text;

namespace Core.Data
{
    public class AesCrypto<T> : ICrypto<T>
    {
        public string Encrypt(T source, string salt)
        {
            var enc = Encoding.Unicode;
            var rawData = JsonConvert.SerializeObject(source);
            return enc.GetString(AESThenHMAC.SimpleEncryptWithPassword(enc.GetBytes(rawData), salt));
        }

        public T Decrypt(string source, string salt)
        {
            var enc = Encoding.Unicode;
            var decryptedBytes = AESThenHMAC.SimpleDecryptWithPassword(enc.GetBytes(source), salt);
            return JsonConvert.DeserializeObject<T>(enc.GetString(decryptedBytes));
        }
    }
}

然后进行简单的单元测试以确认所有工作正常:

public void TestAesCrypto()
{
    var testInput = new EncryptableObject { Id = 123, Name = "Victim", When = DateTimeOffset.UtcNow };
    var crypto = new AesCrypto<EncryptableObject>();

    var saltBytes = new byte[32];
    new Random().NextBytes(saltBytes);
    var testSalt = Encoding.Unicode.GetString(saltBytes);

    var magicString = crypto.Encrypt(testInput, testSalt);
    var testOutput = crypto.Decrypt(magicString, testSalt);

    Assert.AreEqual(testInput.Id, testOutput.Id);
    Assert.AreEqual(testInput.Name, testOutput.Name);
    Assert.AreEqual(testInput.When, testOutput.When);
}

由于某种原因,解密方法返回空值,因为在jbtule的要点的第261行执行的检查将值255与0进行了比较。

这是我尝试直接与.NET类型交谈之后的后续内容(请参阅AesEncryption似乎没有解密对吗?),我只需要一个在此刻始终有效的解决方案。

战争

我们到了,多亏@dbc ...我怎么没发现我不知道的东西!

using Newtonsoft.Json;
using System;
using System.Text;

namespace Core.Data
{
    public class AesCrypto<T> : ICrypto<T>
    {
        public string Encrypt(T source, string salt)
        {
            var e = Encoding.UTF8;
            var rawData = e.GetBytes(JsonConvert.SerializeObject(source));
            var cipherData = AESThenHMAC.SimpleEncryptWithPassword(rawData, salt);
            return Convert.ToBase64String(cipherData);
        }

        public T Decrypt(string source, string salt)
        {
            var e = Encoding.UTF8;
            var decryptedBytes = AESThenHMAC.SimpleDecryptWithPassword(Convert.FromBase64String(source), salt);
            return JsonConvert.DeserializeObject<T>(e.GetString(decryptedBytes));
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章