我想保存在本地数据库中加密的密码(在Windows手机上)。为此我首先要用这个加密密码。
byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW);
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null);
return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
当我使用它时,我得到这样的encyrpted密码:
“\ 0賐 ᔁᇑ쀀쉏\ 0쐮 毸䉯侫\ 0 \ 0 \ 0 \ 0昐\0Â\ 0 \ 0⎛ꌾၜჸ㸴뀲േ赂赂赂ۈ䎳䎳웠웠\ 0 \ 0耎\0Ȁ\ 0 \0tƽ팃ல 갗ꪄ꒱꒱ ʥ鱼@ \ 0챞Ċ뽨뒸缙缙缙缙ᦹ諻⋤떵孵ר䒹춳✴频ľ뚿㠔꾹놼ɝ⍔” 受保护的passwordPasswordByte的长度为230个字节。
我的解密功能如下所示:
byte[] encryptedBytes = UTF8Encoding.UTF8.GetBytes(encrytpedPW);
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null);
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length);
现在enycrptedBytes数组长度为290个字节,密码甚至无法解密,因为Unprotect函数会抛出错误“无效数据”
但是如果我使用Convert.BaseString64函数,一切正常:
加密:
byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW);
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null);
return Convert.ToBase64String(protectedPasswordByte, 0, protectedPasswordByte.Length);
解密:
byte[] encryptedBytes = Convert.FromBase64String(encrytpedPW);
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null);
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length);
你们有没有人知道UTF8编码有什么问题?因为推荐的第一种方式是MSDN。
答案 0 :(得分:3)
不要这样做:
return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length);
首先,为了清楚起见,我强烈建议您使用Encoding.UTF8
代替UTF8Encoding.UTF8
。这不会解决问题,但这是一个很好的习惯 - UTF8
属性是在Encoding
上宣布的,而不是UTF8Encoding
,所以它是'更清楚地承认这一点。
主要问题是您没有获得文本数据。当您获得的二进制数据不是常规编码文本数据时,您不应该使用Encoding.GetString
。您已经获得了无法表示文本的任意二进制数据(直到它被解密)。
Base64精确设计用于表示ASCII文本中的任何二进制数据 - 因此您不会因二进制数据而丢失任何数据,因为二进制数据根本没有任何&# 34;直"您决定使用的任何编码的文本表示。您应该使用Base64 - 或十六进制或类似的东西 - 只要您想将任意二进制数据编码为文本。