
保持密码一直是令人头疼的问题。 在经典版本中,您有一个用户正在努力避免忘记极为机密的“ qwerty123”和存储此密码中的哈希值的信息系统。 一个好的系统还会仔细地撒盐,以毒害那些可以使用散列密码窃取数据库的坏人的生活。 这里的一切都清楚了。 有些密码存储在头部,有些密码在keepass中加密。
当我们从计划中删除一个认真地从纸上输入密钥的人时,一切都会改变。 在两个信息系统的交互中,无论如何,密码应以系统的开放形式存储在客户端,以便可以传输密码并将其与参考哈希进行比较。 在此阶段,管理员通常会打开自行车制造厂的本地分支机构,并开始谨慎地将秘密密钥隐藏,混淆和掩埋在脚本代码中。 这些选择中的许多不仅无用,而且很危险。 我将尝试为python提供一个方便,安全的解决方案。 还有一点关于powershell的信息。
怎么办
每个人都熟悉“临时脚本”的概念。 在这里,从字面上看,只有数据可以从数据库中快速解析并删除。 然后突然发现脚本已经从dev区域迁移到生产环境中的某个位置。 然后,最初的“可处置性”令人不快的惊喜开始出现。
最常见的选择是以下样式:
db_login = 'john.doe' password = 'password!'
问题在于,这里的密码清晰明了,并且通过自动搜索很容易在旧脚本存放处检测到密码。 稍微复杂一点的版本遵循从模糊到安全的路径,密码以加密形式存储在代码中。 在这种情况下,应立即执行解密,否则客户端将无法向服务器端提供此密码。 这种方法可以从随意的外观中节省最大的成本,但是手动进行任何认真的代码分析,都可以轻松提取密钥。 下面的代码将仅从此类“肩膀冲浪者”中保存:
>>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password
最不愉快的情况是对带有敏感信息的文件使用版本控制系统(如git)。 即使作者决定清除所有密码,它们也将保留在存储库的历史记录中。 实际上,如果您在git中运行包含机密数据的文件,则可以自动将其视为已泄露,并立即开始替换所有受影响凭据的过程。
使用系统存储
有一个很酷的
钥匙圈库。 操作的基本原理基于以下事实:操作系统的每个用户都有其自己的加密存储,只有在用户登录系统后才能访问该存储。 它是跨平台的,将使用后端来存储操作系统提供的密码:
- KDE4&KDE5 KWallet(需要dbus)
- Freedesktop Secret Service-许多DE,包括GNOME(需要secretstorage)
- Windows凭证储物柜
- macOS钥匙串
如果绝对需要某些奇怪的东西,您也可以使用
其他后端或编写自己的
后端 。
比较攻击难度
将密码直接存储在脚本中时,您需要 :
- 窃取代码本身(简单)
- 必要时进行模糊处理(轻松)
使用本地密钥环时,攻击者需要:- 窃取代码本身(简单)
- 必要时进行模糊处理(轻松)
- 通过以受攻击用户身份登录(困难)来破坏本地计算机
从理论上讲,如果本地用户知道秘密密码的访问设置,则可以通过任何代表当前用户运行的本地程序来访问本地存储。 但是,这不是问题,因为在帐户遭到破坏的情况下,攻击者将能够拦截所有敏感数据。 其他用户及其软件将无权访问本地密钥库。
使用范例
import argparse import getpass import keyring def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--newpass", required=False, help="Set new password", action="store_true") arguments = parser.parse_args() return arguments def fake_db_connection():
密码安全
另一个常见的秘密密码泄漏是命令行历史记录。 此处不允许使用标准输入:
age = input("What is your age? ") print "Your age is: ", age type(age) >>output What is your age? 100 Your age is: 100 type 'int'>
在上面的示例中,我已经提到了
getpass库:
使用数据时输入数据类似于登录时的经典* nix方法。 数据不会写入或显示在任何系统日志的任何屏幕上。
关于Powershell的一些知识
对于Powershell,正确的选择是使用标准Windows凭据锁定器。
这由
CredentialManager模块实现。
用法示例:
Install-Module CredentialManager -force New-StoredCredential -Target $url -Username $ENV:Username -Pass .... Get-StoredCredential -Target ....