相关疑难解决方法(0)

更改字符串中的一个字符?

Python中替换字符串中字符的最简单方法是:

text = "abcdefg";
text[1] = "Z";
           ^
Run Code Online (Sandbox Code Playgroud)

python string

345
推荐指数
9
解决办法
67万
查看次数

安全擦除内存中的密码(Python)

如何将用户输入的密码存储在内存中,并在不再需要后将其安全擦除?

详细说明,目前我们有以下代码:

username = raw_input('User name: ')
password = getpass.getpass()
mail = imaplib.IMAP4(MAIL_HOST)
mail.login(username, password)
Run Code Online (Sandbox Code Playgroud)

在调用该login方法之后,我们需要做些什么来填充包含带有乱码的密码的内存区域,以便有人无法通过执行核心转储来恢复密码?

有一个类似的问题,但它是在Java中,解决方案使用字符数组: 在创建帐户时,如何在内存中安全地存储密码?

这可以用Python完成吗?

python security passwords

44
推荐指数
4
解决办法
1万
查看次数

为了安全起见,清除不同语言的内存

在学习Java时,我了解到Strings 对于存储密码不安全的,因为你无法手动清除与它们相关的内存(你不能确定它们最终会被gc'ed,内部字符串可能永远不会,甚至之后gc你不能确定物理内存内容真的被擦除了).相反,我使用char数组,所以我可以在使用后将它们清零.我试图在其他语言和平台上搜索类似的做法,但到​​目前为止我找不到相关的信息(通常我看到的是密码存储在字符串中的代码示例,没有提到任何安全问题).

我对浏览器的情况特别感兴趣.我经常使用jQuery,而我通常的做法就是将密码字段的值设置为空字符串而忘记它:

$(myPasswordField).val("");
Run Code Online (Sandbox Code Playgroud)

但我并不是100%确信它已经足够了.我也不知道用于中间访问的字符串是否安全(例如,当我$.ajax用来将密码发送到服务器时).至于其他语言,通常我没有提到这个问题(我特别感兴趣的另一种语言是Python).

我知道试图建立列表的问题是有争议的,但由于这涉及一个很大程度上被忽视的共同安全问题,恕我直言,这是值得的.如果我弄错了,我会很高兴知道从JavaScript(在浏览器中)和Python.我也不确定是在这里,在security.SE还是在程序员.SE,但由于它涉及安全执行任务的实际代码(不是概念性问题),我相信这个网站是最好的选择.

注意:在低级语言或明确支持字符作为原始类型的语言中,答案应该是显而易见的(编辑:不是很明显,正如@Gabe在下面的答案中所示).我要求那些"一切都是对象"或类似的高级语言,以及那些在幕后执行自动字符串实习的人(所以你可能会创建一个安全漏洞而不会意识到它,即使你'合理谨慎).

更新:根据相关问题的答案,即使char[]在Java中使用也不能保证是防弹的(或者就此而言是.NET SecureString),因为gc可能会移动数组,因此其内容可能会粘在内存中,即使在清除(SecureString至少保留在相同的RAM地址中,保证清除,但其消费者/生产者可能仍然留下痕迹).

我猜@NiklasB.是正确的,即使漏洞存在,漏洞利用的可能性很低,防止漏洞的难度很高,这可能是这个问题大多被忽视的原因.我希望我至少可以找到关于浏览器这个问题的一些参考,但谷歌搜索到目前为止一直没有结果(这个场景至少有一个名字吗?).

security string passwords memory-management

6
推荐指数
1
解决办法
825
查看次数

python中的ctypes与memset崩溃

我试图从内存中删除密码字符串,就像在这里建议的那样.

我写了那个小片段:

import ctypes, sys

def zerome(string):
    location = id(string) + 20
    size     = sys.getsizeof(string) - 20
    #memset =  ctypes.cdll.msvcrt.memset
    # For Linux, use the following. Change the 6 to whatever it is on your computer.
    print ctypes.string_at(location, size)
    memset =  ctypes.CDLL("libc.so.6").memset
    memset(location, 0, size)
    print "Clearing 0x%08x size %i bytes" % (location, size)
    print ctypes.string_at(location, size)

a = "asdasd"

zerome(a)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这段代码可以和IPython一起使用,

[7] oz123@yenitiny:~ $ ipython a.py 
Clearing 0x02275b84 size 23 bytes
Run Code Online (Sandbox Code Playgroud)

但崩溃与Python:

[8] oz123@yenitiny:~ $ python a.py …
Run Code Online (Sandbox Code Playgroud)

python ctypes ipython

5
推荐指数
1
解决办法
2762
查看次数

在python中mlock一个变量

我正在为linux编写密码管理器应用程序,我正在使用Python.

由于安全原因,我想调用mlock??系统调用,以避免硬盘驱动器上的交换密码变量.

我注意到python本身没有包装这个函数.

那有什么办法可以避免交换吗?

谢谢

python swap system-calls

5
推荐指数
1
解决办法
646
查看次数