首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ruby中存储可解密密码的安全方法

在ruby中存储可解密密码的安全方法
EN

Stack Overflow用户
提问于 2015-01-09 14:36:11
回答 4查看 2.5K关注 0票数 3

我想以一种安全的方式在数据库中以加密的形式存储一些密钥。同时,我需要在代码中的某处使用非加密(原始)形式的密钥。我计划使用PBKDF2对PBKDF2进行口令哈希运算。是否可以使用PBKDF2以加密的形式解密存储在数据库中的密钥。或者有什么简单而安全的程序可用?

EN

回答 4

Stack Overflow用户

发布于 2015-01-09 17:13:44

密码和密钥通常以其散列形式存储。这意味着它们在保存到数据库之前通过哈希函数进行处理。一个好的散列函数,如bcrypt,具有以下属性:

它对相同的输入产生相同的输出,它对不同的输入产生非常不同的输出,它的输出与reversible不同,

  • ,it is
  • ,it is

最后一个属性具有非常重要的安全含义:当有人访问数据库时,他们无法恢复原始密钥,因为散列函数是不可逆的,特别是当散列被加盐以防止攻击者使用彩虹表时。

这意味着如果您想在以后恢复密钥,您必须以加密(而不是散列)的形式保存它们。加密函数具有与散列函数类似的属性,但关键区别在于它实际上是可逆的。对于这个解密步骤,您需要一个密钥,该密钥需要存储在某个地方。

您可以将密钥存储在您的应用程序配置中,但这意味着如果有人访问您的服务器,他们将能够检索加密密钥并解密所有存储的密钥。

我建议另一种方法,允许用户只检索他们自己存储的密钥。它基于这样一种想法,即密钥使用只有用户知道的特定于用户的密码进行加密。每当您需要执行需要存储或检索密钥的操作时,都会提示用户输入其密码。这样,无论是您自己还是攻击者都无法检索它们,但如果用户通过输入其密码允许,则您的程序可以访问它们。

  • 将传统的散列用户密码存储在数据库中,例如使用bcrypt
  • 允许用户通过以下步骤存储额外的密码:
    • 提示输入用户密码和密钥以存储AES <

    >H121散列密码,并与数据库比较每个输入的密钥的加密盐

    • 使用用户输入的密码和盐来加密密钥以存储,例如使用AES encryption
    • Store盐和database

中的加密密钥

在需要以纯文本形式检索存储密钥的操作中使用数据库来检索存储的密钥:使用用户密码和salt从database

  • Decrypt存储的密钥中使用authenticate

  • Retrieve

  • 提示输入用户密码和密码,并与数据库进行比较

注意从应用程序日志中删除用户提交的密码;-)

票数 7
EN

Stack Overflow用户

发布于 2015-01-10 01:41:58

密码永远不会以任何方式存储在数据库中,以便人们以后可以解密它们。不能保证有人不会入侵您的数据库表并窃取您存储的所有内容。

如果您为每个用户存储加密(散列)密码,即使您的数据库遭到黑客攻击,窃取您的解密密码的人也会花费很长时间才能找出真正的密码。它们可以始终使用相同的加密,并比较常见密码的散列结果。例如,他们可以加密"MyPassword123“,然后将散列后的密码与数据库中的每个密码进行比较。使用此模式仍然可以猜到弱密码。

因此,即使是不可解密的密码也有其弱点,但如果您允许某人解密您存储的内容,那么他们基本上很容易获得您用户的每一个密码。非常糟糕的做法。一些最大和最“安全”的公司存储的密码散列被盗,所以你不能假设你不会成为受害者。

票数 1
EN

Stack Overflow用户

发布于 2016-11-16 00:25:49

我在使用Ruby的bcrypt中遇到过同样的问题,因为它比较了用户输入的明文和散列密码之间的差异,而散列密码永远不会解密为明文。加密器是我发现的可能解决您的问题的gem之一,它使用几个不同的密钥进行加密。因此,您可以将密码保存在数据库中,同时将密钥安全地保存在另一个位置(存储中的文件)。

更多信息可以在rubygems page中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27855089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档