如何使用’System.Security.Cryptography.AesManaged’来加密字节?
基本上我想使用System.Security.Cryptography.AesManaged(或者更好的类,如果你认为有一个?)来获取一个字节数组并使用给定的对称密钥创建另一个加密的字节数组(我假设我需要一?)。
我还需要改变这个程序的方法。
关键是我可以加密存储的密码。 我假设有一种简单的方法可以做到这一点?
谢谢
这是我最终做的,受到(旧版本)迈克尔答案的启发:
private string Encrypt(string input) { return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(input))); } private byte[] Encrypt(byte[] input) { PasswordDeriveBytes pdb = new PasswordDeriveBytes("hjiweykaksd", new byte[] { 0x43, 0x87, 0x23, 0x72, 0x45, 0x56, 0x68, 0x14, 0x62, 0x84 }); MemoryStream ms = new MemoryStream(); Aes aes = new AesManaged(); aes.Key = pdb.GetBytes(aes.KeySize / 8); aes.IV = pdb.GetBytes(aes.BlockSize / 8); CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(input, 0, input.Length); cs.Close(); return ms.ToArray(); } private string Decrypt(string input) { return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(input))); } private byte[] Decrypt(byte[] input) { PasswordDeriveBytes pdb = new PasswordDeriveBytes("hjiweykaksd", new byte[] { 0x43, 0x87, 0x23, 0x72, 0x45, 0x56, 0x68, 0x14, 0x62, 0x84 }); MemoryStream ms = new MemoryStream(); Aes aes = new AesManaged(); aes.Key = pdb.GetBytes(aes.KeySize / 8); aes.IV = pdb.GetBytes(aes.BlockSize / 8); CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(input, 0, input.Length); cs.Close(); return ms.ToArray(); }
编辑:注意eed3si9n的编辑…我同意,对称加密是密码的不错选择。 请改用哈希(而不是 MD5)。 这是一个非常完整的例子 。
一个简单的例子:
byte[] clear = GetCleartext(); HashAlgorithm sha2 = SHA256CryptoServiceProvider.Create(); byte[] hashed = sha2.ComputeHash(clear);
要validation正确的密码,您将对提供的密码运行相同的计算,并将结果与数据库中的哈希值进行比较。
最好将盐(随机数据)添加到明文中以避免彩虹表攻击 。 基本上,在散列之前,将已知的随机生成的值(该用户唯一的值)附加到明文。
在C#中简单加密和解密数据 。
编辑 :对于密码,我建议使用BCrypt而不是进行双向加密,除非您确实需要恢复原始密码。 通常,您只需要有人知道密码,而不是密码本身。
在https://www.superstarcoders.com/blogs/posts/symmetric-encryption-in-c-sharp.aspx上有一个非常好的对称密钥加密C#实现。 它支持AES,Triple DES和Rijndael。 它易于遵循以下forms的function:
string Encrypt(string plaintext, string password, string salt)
OP声明他们必须将凭据传递给另一个服务,这与密码存储和validation完全不同。
根据您对合作伙伴服务的控制程度或它们所展示的内容,最佳解决方案涉及供应商提供的或行业标准方法,如Kerberos,SAML或其他稳定,安全的承载令牌方式,以实现流量信任。 这是一个很深刻的话题。
但我们假设您需要通过Basic Auth SSL / TLS传递凭据。 所以现在你需要以可逆的方式安全地存储它们。 为了解决这个问题,我已经成功使用证书私钥传送密钥。 这为操作系统提供了一些保密,并允许OPS人员管理密钥,这是可取的。 必须为用于运行进程的帐户授予查看私钥的权限,该私钥随后终止操作系统上的信任链。
您仍然可能需要考虑键旋转,这将要求您使用密文存储版本号。
此外,SecureString可能很有用,但是在所有.NET API允许SecureString作为凭证的一部分传递之前,通常您最终会在托管堆上找到一个无法销毁的字符串。
无论如何,这不是一个勺子反馈代码,但从经验来看,我发现管理密钥链总是一个问题,如果你不能在一个强化的基础设施,如Active Directory终止,证书是次佳的事情。
上述就是C#学习教程:如何使用’System.Security.Cryptography.AesManaged’来加密字节?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959017.html