我有一个需要运行bash脚本的PHP应用程序,并提供用户名&密码(用于远程系统)。 我需要将这些凭据存储在我的PHP(Web)应用程序可访问的某个位置。 逻辑位置是数据库(目前是MySQL,但是不可知)。 散列和存储凭证的“标准”方式的问题在于它是不可逆的。我有能够以未加密的明文形式获取凭证,以便能够将数据插入到bash脚本中。
有没有人对安全的方法有任何建议?
我想也许是PKI的凭证,并将结果存储在数据库中。然后使用私钥解密(PHP可以做到这一点)。存储脚本以在Web根目录外执行此操作。
任何想法都非常感激。
答案 0 :(得分:23)
首先,说明(希望)明显,如果你可以以任何方式避免存储用户名和密码这样做;这是一项重大责任,如果您的凭据存储被破坏,它可能会为同一用户提供访问许多其他地方(由于密码共享)。
其次,如果您必须使用不可逆的盐渍加密哈希来存储凭证,而不是存储密码,那么如果您的数据受到损害,则密码不能轻易地进行逆向工程,并且根本不需要存储解密密钥
如果您必须存储可解密的凭据:
如果无需用户名来查找帐户记录(在您的情况下不是这样),请加密用户名和密码。如果对两者进行加密,请将它们加密为一次加密运行,例如
userAndPass =(用户+ “:” +传);
encryptInit();
加密(盐);
加密(userAndPass);
密文= encryptFinal();
并存储奇异的blob,这样就可以减少短密文的出现,这些密文更容易破解,而且用户名进一步限制了密码。
PS:我不用PHP编程,因此无法在该环境中对合适的加密s / w发表评论。
答案 1 :(得分:15)
你需要研究好的双向加密方法,我的一般经验法则是:
因此,找到一个经过充分验证的良好实现,并利用它。
这里可能有一些很好的信息:
答案 2 :(得分:3)
检查此库:PECL gnupg它为您提供了与gnupg交互的方法。您可以使用安全公钥加密算法轻松encrypt and decrypt数据。
答案 3 :(得分:2)
我建议您不要存储密码,而是通过生成ssh密钥并将公钥存储在远程系统的authorized_keys文件中,使用从主机到远程系统的无密码ssh连接。然后,您只需要在配置期间建立连接。不可否认的是,并没有完全回答你的问题,但以可逆的形式存储密码对于安全漏洞来说是一个滑坡,尽管我确信聪明的大脑可以使它安全。
答案 4 :(得分:1)
一个简单的入门方法是使用mysql的ENCODE()和DECODE()函数。我不知道下面使用了什么算法,但它很容易使用:
INSERT INTO tbl_passwords SET encoded_pw = ENCODE('r00t', 'my-salt-string');
和
SELECT DECODE(encoded_pw, 'my-salt-string') FROM tbl_passwords;
答案 5 :(得分:0)
如果你去了PKI,我会确保你保护你的私钥! PKI提供的强大加密功能与密钥一样安全。
答案 6 :(得分:0)
我认为你是目标。请查看GPG以获取良好的开放式加密库
答案 7 :(得分:0)
看起来你几乎有两种方法可以做到这一点:
1)与您建议的一样,使用加密算法或算法然后可以解密并用于脚本中的身份验证。您可以在PHP中使用MCrypt库来完成此任务。
2)根据所需的安全级别和脚本的漏洞级别,您可以使用安全哈希,密钥或其他一些难以猜测的唯一标识符,您可以使用这些标识符来劫持每个用户的帐户。脚本。
答案 8 :(得分:0)
正如许多人所述,您需要加密用户名和密码。我建议您查看php的mcrypt扩展名以进行加密/解密。
答案 9 :(得分:0)
我想我将调查使用Web应用程序即时嵌入的凭据编译PHP脚本。
我会要求提供凭据(用于给定用途),然后创建并编译新的PHP脚本,仅供此用户使用。这样,脚本将仅执行我需要的操作,并且不应该是“可读”的。我认为这听起来是最安全的方法。
将尝试使用Roadsend。 http://www.roadsend.com/
答案 10 :(得分:0)
为了跟进使用MySQL编码和解码功能的建议,本手册vague介绍了这些工作原理:
加密的强度取决于随机生成器的优异程度。它应该足够短字符串。
但我建议你可以使用内置的MySQL 5.0 AES functions; AES_ENCRYPT()
和AES_DECRYPT()
SELECT AES_ENCRYPT('secret squirrel', '12345678') AS encoded
=> ØA;J×ÍfOU»] É8
SELECT AES_DECRYPT('ØA;J×ÍfOU»] É8', '12345678') AS decoded
=> secret squirrel
这些使用128位AES,对于大多数用途来说应该足够强大。正如其他人评论的那样,使用盐值和具有高熵的密钥是一种很好的做法。
答案 11 :(得分:0)
对于PHP,请务必注意通过MCRYPT_RIJNDAEL函数实现AES加密 。当PHP有可用时,不要为非开放实现付费。
有关详细信息,请参阅PHP page discussing available ciphers。