草庐IT

php - 以可逆形式存储密码

coder 2023-06-15 原文

我有一个 PHP 应用程序需要运行 bash 脚本,并提供用户名和密码(用于远程系统)。 我需要将这些凭据存储在我的 PHP(Web)应用程序可以访问的地方。 逻辑位置是数据库(目前是 MySQL,但将不可知)。 散列和存储凭据的“标准”方式的问题在于它是不可逆的。我能够以未加密的明文形式获取凭据,以便能够将数据插入 bash 脚本。

有人对解决此问题的安全方法有任何建议吗?

我想也许 PKI'ing 凭据,并将结果存储在数据库中。然后使用私钥解密(PHP 可以做到)。将脚本存储在 Web 根目录之外执行此操作。

非常感谢任何想法。

最佳答案

首先,声明(希望如此)显而易见,如果您能以任何方式避免存储用户名和密码,请这样做;这是一项重大责任,如果您的凭据存储被破坏,它可能会为同一用户提供对许多其他地方的访问权限(由于密码共享)。

其次,如果您必须使用不可逆的加盐加密散列来存储凭据而不是存储密码,那么如果您的数据被泄露,密码就不容易被逆向工程并且根本不需要存储解密 key .

如果您必须存储可解密的凭据:

  1. 选择一个好的加密算法 - AES-256、3DES(已过时)或公钥密码(尽管我认为对于此用途而言没有必要)。使用来自信誉良好且值得信赖的来源的加密软件 - 不要尝试自己动手,否则很可能会弄错。
  2. 使用安全 随机生成器生成您的 key 。弱随机性是加密相关安全故障的首要原因,而不是密码算法。
  3. 将加密/解密 key 与您的数据库分开存储在一个 O/S 安全文件中,只有您的应用程序运行时配置文件可以访问。这样,如果您的数据库遭到破坏(例如通过 SQL 注入(inject)),您的 key 不会自动受到攻击,因为这通常需要访问 HDD。如果您的操作系统支持与配置文件相关联的文件加密,请使用它 - 它只能提供帮助并且通常是透明的(例如 NTFS 加密)。
  4. 如果可行,将 key 本身用主密码加密存储。这通常意味着您的应用程序。将需要在启动时输入该密码 - 在脚本的参数中提供它没有任何好处,因为如果您的 HDD 被破坏,您必须假设可以查看 key 文件和脚本。
  5. 对于每个凭据集,存储一个salt(未加密)和加密数据;这用于“启动”加密密码,使得两个相同的密码不会产生相同的密文 - 因为这表明密码是相同的。
  6. 如果用户名不是定位帐户记录所必需的(在您的情况下不是),请加密用户名和密码。如果您同时加密两者,请将它们加密为一次加密运行,例如

    userAndPass=(user+":"+pass);
    加密初始化();
    加密(盐);
    加密(用户密码);
    cipherText=encryptFinal();

    并存储单数blob,这样短密文出现的次数更少,更容易破解,用户名进一步加盐密码。

PS:我不使用 PHP 编程,因此无法评论该环境中合适的加密软件。

关于php - 以可逆形式存储密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/260664/

有关php - 以可逆形式存储密码的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  3. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  4. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  5. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

  6. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  7. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  8. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  9. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  10. ruby - 如何将一段文本可逆地压缩成更少的 ASCII 字符? - 2

    我想获取任意的ASCII文本字符串,例如“Helloworld”,并将其压缩为字符数较少(尽可能少)的版本,但要采用可以解压缩的方式。压缩版本应仅由ascii字符组成。有没有一种方法可以做到这一点,尤其是在Ruby中? 最佳答案 如果知道只会使用ASCII字符,那就是每个字节的低7位。通过位操作,您可以将每8个字节混合成7个字节(节省12.5%)。如果您可以将其放入更小的范围(仅限64个有效字符),则可以删除另一个字节。但是,因为您希望压缩形式也只包含ASCII字符,所以会丢失一个字节-除非您的输入可以限制为64个字符(例如,有损压

随机推荐