【问题标题】:SHA-256 on the database side数据库端的 SHA-256
【发布时间】:2015-05-10 19:17:25
【问题描述】:

我正在为电视剧制作移动应用。基本上就像一个跟踪器,知道什么时候看什么剧集。我想将观看的剧集、用户节目等信息存储在数据库中。 (我从休息 api 获得的节目信息)

所以问题是我觉得这里不需要服务器,我只是不知道它应该做什么。

问题是我想让数据库安全。从我读过的最佳实践来看,最好的做法是使用加密强的随机数生成器创建盐,并将其添加到密码中,然后使用散列算法(例如 SHA-256)对整个内容进行散列。 然后我将哈希密码和盐存储在数据库中,当我想检查密码是否正确时,只需再次对其进行哈希处理并与数据库中的进行比较。

所以我在 Java 中有一个特殊的类可以创建这样的盐,我只需要知道在哪里以及如何对整个事物进行哈希处理。我要问的是什么。我不想创建一个只会散列密码的服务器。

另外一件事是如何实现自动登录,一旦我弄清楚了,我也想添加它。

我希望现在我想在这里完成什么更清楚。

【问题讨论】:

  • 两者都不是。服务器端,在将其发送到数据库之前。在您的应用程序本身中执行此操作,而不是在数据库中。使用像 bcrypt 这样的已建立的库,并且在任何情况下都不要使用你自己的加盐和散列方案。
  • 我的意思是,不要自己做加盐和散列,比如尝试生成随机盐然后做 SHA-whatever。使用图书馆。除了数据库之外,肯定应该有 some 服务器端。如果您的移动应用程序直接连接到数据库,没有中间层,这意味着您将数据库凭据存储在客户端中。这是一个巨大的安全漏洞,所以我希望这不是你正在做的。 (顺便说一句,鉴于您在问题的任何地方都没有提及,我们怎么可能知道这是一个移动应用程序?)
  • @HoboSapiens: SHA-256不被认为是弱者。您可能正在考虑使用 SHA-1。
  • @ilmarikaronen 你说的很对 - 早上太早了!
  • @Greyshack 我认为这里存在根本的误解。据我了解,您需要:(1) 数据库服务器和 (2) 用 Ja​​va 编写的移动客户端。客户端将连接到服务器,检索哈希,并将其与某物进行比较。如果这就是您的意思,那么它非常不安全,因为您必须分发数据库凭据。最终用户很容易提取它们并完全控制数据库。相反,如果您要连接到设备上的仅限本地数据库,您打算如何在验证凭据之前进行连接?

标签: database security hash password-protection sha256


【解决方案1】:

听起来您正在构建一个独立的移动应用程序,即不与服务器通信。

您希望应用程序受密码保护(即使他们的手机已经受密码保护),并且您希望存储此密码散列,以便密码无法在丢失的手机上恢复。

SHA256 是一个很好的散列,但你想要的是一个 真正慢 的散列。使用 bcrypt、PBKDF2 或 scrypt。

盐不是秘密。

当用户创建他们的帐户时,创建 salt,用 salt 对 pwd 进行哈希处理,并将密码和 salt 存储在某处。每次用户登录时,获取盐,和以前一样对密码进行哈希处理,并与保存的密码进行比较。如果相同,则用户进行身份验证。

您不需要将密码存储在 sqlite 中。将其存储在文本文件中可能更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2013-06-03
    • 2014-08-19
    • 2016-04-29
    相关资源
    最近更新 更多