1

不幸的是,我有一些代码可以做到这一点:

            byte[] plainText = System.Text.Encoding.ASCII.GetBytes(ClearText);
            var btcipherText = enc.Encrypt(plainText, btkey);
            System.Text.Encoding en = System.Text.Encoding.Default;
            return en.GetString(btcipherText);

然后将其作为用户密码保存到数据库中。

在单声道中,在 Ubuntu 12.04 上System.Text.Encoding.Default是 System.Text.Encoding.UTF8,而在 Windows 7 上,它似乎是System.Text.SBCSCodePageEncoding.

密码加密/解密代码不应该使用System.Text.Encoding.Default,但这是继承代码。查看System.Text.Encoding并广泛搜索我的问题后,我无法确定如何使用标准编码解码此字符串,在这种情况下,在缺少原始编码的 Mono/Linux 堆栈上。

我也奇怪地找不到太多关于System.Text.SBCSCodePageEncoding

当我尝试解密使用此编码存储的字符串时,我得到通常的“错误数据”和“无效块大小”加密异常。

任何信息或建议表示赞赏。

4

2 回答 2

1

在另一个答案的基础上,假设您知道使用哪些有限的编码集将 byte[] 转换为字符串,构建一个实用程序(或将其构建到应用程序中,以便在使用密码时升级密码)读取和将密码解码回有效的 byte[],然后将 byte[] 作为 Base64 存储在数据库中。

我看到您还考虑对密码进行哈希处理,在这种情况下以及几乎任何其他情况下,如果您处理实际上不代表文本的字节 [],您需要将其存储/显示为字符,那么 base64 始终是一个不错的选择。

如果您决定对密码进行哈希处理,请确保使用 HMAC 样式的哈希系统,而不仅仅是普通密码 + salt,或者更好地为 .net 获取 bcrypt 实现。

http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

于 2012-10-03T11:50:36.433 回答
0

在这种情况下,我将制作一个应用程序来解密数据库中的所有密码,使用 UTF8 编码对其进行加密并更新数据库。然后把原来的代码改成UTF8。

于 2012-09-30T10:26:51.033 回答