c# - 从(多个)用户输入(应用程序密码)中获取数据库密码

标签 c# database cryptography passwords

我正在使用 C#(.NET 4.0、SQL CE 4.0 数据库)编写一个小型业务应用程序。数据库是加密的(SQL CE支持数据库加密),但据我所知,来自http://msdn.microsoft.com/en-us/library/aa257373(v=sql.80).aspx密码:

Can be up to 40 characters long. Can contain letters, symbols, digits, or a combination. Cannot be recovered.

我的用户将输入应用程序的密码,这可能不会非常复杂和安全。因此,我想以某种方式修改用户密码,为数据库加密创建一个更安全的密码。据我所知,有 Rfc2898DeriveBytes Class,它从密码派生字节。但是我需要有效字符 ( Allowed character for SQL Server CE password? ) 作为数据库密码,这意味着我可能无法使用 toBase64String()

到目前为止,我的想法是为数据库创建一个随机且安全的密码,并将其保存到一个文件中,该文件将使用 AES256 加密, key 来自用户密码。有没有更好的方法来做到这一点?

另外,我怎样才能实现多个用户(每个用户都有自己的应用程序密码)可以使用相同的数据库密码访问同一个数据库?

感谢您的宝贵时间和答复

最佳答案

您不能直接执行此操作:将所有用户密码转换为相同数据库密码的函数将破坏数据库加密的目的。同构于在应用程序中存储数据库密码。

这并不是说没有简单的解决方法:

  • 有第二个文件 - 未加密的 SQL CE 数据库或纯文本文件
  • 里面有一个简单的表格:

    用户 | EncryptedPassword(所有字符串)

  • 对于每个用户,此文件中都有一行(如果是文本文件,则为一行)包含用户名和用用户密码加密的数据库密码(显然是密码的二进制哈希,存储为 base64 )

  • 当用户登录时,使用给定的密码解密该用户的 EncryptedPassword 字段,这应该是数据库密码,您现在可以使用该密码打开数据库

  • 这也意味着,由于未能提供正确的 SQL 数据库密码而检测到错误的用户密码。

关于c# - 从(多个)用户输入(应用程序密码)中获取数据库密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035376/

相关文章:

android - 如何在Android中写一个类似于Python函数的hash函数?

php - 在 MySQL 中存储敏感数据的最佳方式是什么?

c# - 动态类创建,包括动态类型名称

c# - 如何在 Excel 中更改线条形状的颜色?

c# - 从非 WPF 代码访问 WPF XAML 资源

mysql - 强制 mysql SELECT 查询不使用缓存

python - 假设我在数据库中有 400 行人名。搜索他们姓名的最佳方式是什么?

c# - 为什么不能创建多维数组数组?

mysql - 使用 jQuery AJAX 请求 CodeIgniter 在不刷新页面的情况下从 Controller 显示数据库中的数据到 View

c++ - 使用带有 OpenSSL API 的私钥生成签名