ASP.NET 字符串的对称加密 - 获取值 System.IO.MemoryStream 而不是加密名称
ASP.NET Symmetric Encryption of string - getting the value System.IO.MemoryStream instead of encrypted name
我正在对数据库中的一个字段进行对称加密"name",只是为了测试它。我从来没有这样做过,所以我对此有点陌生。我正在获取用户输入的名称,使用对称加密对其进行加密并将其加密添加到数据库中。但是,名称的值被保存为 System.IO.MemoryStream
SymmetricEncryption 的代码是这样的:
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;
}
然后我有对name进行加密并添加的代码,如下所示(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" 而不是加密名称?
A MemoryStream
实例是包装 backing 字节数组或数组的对象。此实例的状态是写入支持数组的位置和字节数。但是,它不包括支持数组或数组本身。
要一次性从支持数组中检索所有数据,您可以使用方法 ToArray
。如果你简单地使用 ToString
那么你会得到状态的表示,它不包括存储的数据,如上所述。所以 ToString
是 而不是 相当于 ToArray
.
的字符串
密文可以包含任何字节值,它不代表任何文本字符串。它可能包含无效字符,以 character-encoding 用来表示它为准。相反,如果您想要一个字符串,则需要使用 - 例如 - base 64 对返回的字节进行编码。
请注意,与明文的大小相比,base 64 扩展了密文的大小。如果那不可行,那么您可能需要查看格式保留加密 (FPS)。然而,这在任何语言的基础密码学中都不常见,并且需要陡峭的学习曲线。对于名称(通常是可变大小的字符串),扩展应该 通常 无关紧要。
我正在对数据库中的一个字段进行对称加密"name",只是为了测试它。我从来没有这样做过,所以我对此有点陌生。我正在获取用户输入的名称,使用对称加密对其进行加密并将其加密添加到数据库中。但是,名称的值被保存为 System.IO.MemoryStream
SymmetricEncryption 的代码是这样的:
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;
}
然后我有对name进行加密并添加的代码,如下所示(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" 而不是加密名称?
A MemoryStream
实例是包装 backing 字节数组或数组的对象。此实例的状态是写入支持数组的位置和字节数。但是,它不包括支持数组或数组本身。
要一次性从支持数组中检索所有数据,您可以使用方法 ToArray
。如果你简单地使用 ToString
那么你会得到状态的表示,它不包括存储的数据,如上所述。所以 ToString
是 而不是 相当于 ToArray
.
密文可以包含任何字节值,它不代表任何文本字符串。它可能包含无效字符,以 character-encoding 用来表示它为准。相反,如果您想要一个字符串,则需要使用 - 例如 - base 64 对返回的字节进行编码。
请注意,与明文的大小相比,base 64 扩展了密文的大小。如果那不可行,那么您可能需要查看格式保留加密 (FPS)。然而,这在任何语言的基础密码学中都不常见,并且需要陡峭的学习曲线。对于名称(通常是可变大小的字符串),扩展应该 通常 无关紧要。