如果我将密码作为字符串而不是安全字符串传递,是否总是不安全?
Is it always unsecure if I pass a password as a string and not as a secure string?
我有一个一般性问题:
我不太明白什么时候必须使用安全字符串,什么时候可以使用普通字符串。
例如,假设我想在我的应用程序中使用 PrincipalContext。
PrincipalContext 有多个构造函数,其中很少接受字符串形式的密码。
PrincipalContext(ContextType type, String name ,String username, String password)
如果我在此构造函数中将密码作为字符串传递,是否会导致安全问题?密码会在任何地方以纯文本形式显示吗?
理论上黑客可以读取此密码吗?
是否可以使用安全字符串来代替?
我是编程安全部分的新手,所以如果有人能帮助我理解这一点,我将不胜感激。
谢谢!
字符串是不可变的,当其他进程在垃圾收集处理它之前转储它时可以访问它。
Reference link.
如果您的环境(GUI、存储、数据访问对象...)支持SecureString
,则尽可能长时间(如果可能,一直)将密码保存在 SecureString 中。如果没有,就没有其他选择可以使用 string
.
使用 SecureString 是 一个优势,因为应用程序可以控制包含密码的内存,并且可以在不再使用时清理它(字符串取决于垃圾收集器)。另一方面,它为攻击者提供了在哪里寻找有趣信息的线索,尽管已经可以访问内存,这似乎不是什么大事。
回答你的问题,不,它不会使你的应用程序不安全,但如果有可能将密码一直保存在 SecureString 中,那么应该这样做。
我有一个一般性问题: 我不太明白什么时候必须使用安全字符串,什么时候可以使用普通字符串。
例如,假设我想在我的应用程序中使用 PrincipalContext。
PrincipalContext 有多个构造函数,其中很少接受字符串形式的密码。
PrincipalContext(ContextType type, String name ,String username, String password)
如果我在此构造函数中将密码作为字符串传递,是否会导致安全问题?密码会在任何地方以纯文本形式显示吗? 理论上黑客可以读取此密码吗?
是否可以使用安全字符串来代替?
我是编程安全部分的新手,所以如果有人能帮助我理解这一点,我将不胜感激。
谢谢!
字符串是不可变的,当其他进程在垃圾收集处理它之前转储它时可以访问它。
Reference link.
如果您的环境(GUI、存储、数据访问对象...)支持SecureString
,则尽可能长时间(如果可能,一直)将密码保存在 SecureString 中。如果没有,就没有其他选择可以使用 string
.
使用 SecureString 是 一个优势,因为应用程序可以控制包含密码的内存,并且可以在不再使用时清理它(字符串取决于垃圾收集器)。另一方面,它为攻击者提供了在哪里寻找有趣信息的线索,尽管已经可以访问内存,这似乎不是什么大事。
回答你的问题,不,它不会使你的应用程序不安全,但如果有可能将密码一直保存在 SecureString 中,那么应该这样做。