ASP.NET 字符串的对称加密 - 获取值 System.IO.MemoryStream 而不是加密名称



我正在对数据库"名称"中的字段进行对称加密,只是为了测试它。我从来没有做过,所以我对此有点陌生。我正在获取用户输入的名称,使用对称加密对其进行加密并将其添加到数据库中。但是,该名称的值被保存为 System.IO.MemoryStream

对称加密的代码是这样的:

public static MemoryStream SymmetricEncryptData(MemoryStream stream)
{
stream.Position = 0;
var myAlg = Rijndael.Create();
var myKeys = GenerateSecretKey();
MemoryStream msOut = new MemoryStream();
CryptoStream cs = new CryptoStream(msOut, myAlg.CreateEncryptor(myKeys.SecretKey, 
myKeys.IV), CryptoStreamMode.Write);
stream.CopyTo(cs);
cs.FlushFinalBlock();
return msOut;
}

然后我有代码对名称进行加密并添加它,如下所示(u 是用户实例,Name 是用户输入的名称(

byte[] namee = Encoding.UTF32.GetBytes(u.Name);
MemoryStream stream = new MemoryStream(namee);
u.Name = Encryption.SymmetricEncryptData(stream).ToString();
u.Blocked = false;
ur.AddUser(u);

我是否执行了错误的加密?我做错了什么,为什么我在数据库中得到值"System.IO.MemoryStream"而不是加密名称?

MemoryStream实例是包装一个或多个后备字节数组的对象。此实例的状态是写入后备阵列的位置和字节数。但是,它不包括后备阵列或数组本身。

要一次性从后备阵列中检索所有数据,请使用方法ToArray.如果您只是使用ToString那么您将获得状态的表示形式,其中不包括存储的数据,如上所述。所以ToString不是等同于ToArray的字符串。

密文可以包含任何字节值,并且不表示任何文本字符串。它可能包含无效字符,无论使用哪种字符编码来表示它。相反,如果你想要一个字符串,你需要使用 - 例如 - base 64 对返回的字节进行编码。

请注意,与明文的大小相比,base 64 扩展了密文的大小。如果这不可行,那么您可能需要查看格式保留加密 (FPS(。然而,这在任何语言的基本密码学中都不常见,它需要一个陡峭的学习曲线。对于名称(通常是可变大小的字符串(,扩展通常应该无关紧要。

最新更新