Java中的.Net SecureString

5

我正在尝试在客户现场使用第三方身份验证Web服务。该Web服务是用.Net编写的,接受SecureString作为密码类型。

AuthResult Login(string username, SecureString passkey)

我的应用程序是使用Java编写的,但是Java中没有可以使用的SecureString兼容类型 :( 当我生成一个axis代理时,它会生成一个没有SecureString成员的存根,因此我无法对服务进行身份验证调用。

public class SecureString  implements java.io.Serializable {
    public SecureString() {
        ...
    }
}

我正在尝试使用http://sanguinecomputing.com/a-secure-string-implementation-for-long-term-storage-of-sensitive-data-in-java/来长期存储Java中的敏感数据,但我并不是很有希望。
请问有人能帮我解决这个互操作性问题吗?我正在寻找一种方法,将类型为secureString的参数从Java应用程序代码发送到.Net服务。

你应该能够使用普通字符串。 - Matthew
我无法控制服务。 - Dhawalk
你到底在寻找什么?从“如何解决这个互操作性问题”中并不清楚。是Java中的SecureString实现?还是具有与C# SecureString相同方法的实现?或者需要关于在Java中执行此操作的指导?以下内容可能会有所帮助:SecureString filetype:java - jww
3个回答

3

没错。SecureString不是可序列化的类型。由于SecureString依赖于DPAPI,并且DPAPI本身又依赖于本地计算机属性来构建其加密密钥/向量,因此它永远无法跨计算机进行。

发布具有SecureString类型参数的API表明其设计存在重大缺陷。任何远程客户端都不可能使用该参数。


2
“我的应用程序是用Java编写的,但Java中没有兼容SecureString的类型。你能帮我解决这个互操作性问题吗?”
正如你所知,在Java中没有SecureString类型。在Java中,你应该使用char[]并在使用完后覆盖它的内容。在Java密码扩展(JCE)参考指南的Using Password-Based Encryption中有以下描述:
“收集和存储密码的逻辑似乎是将其存储在java.lang.String类型的对象中。然而,这里有个警告:String类型的对象是不可变的,即没有定义方法允许您在使用后更改(覆盖)或清除String的内容。这个特性使得String对象不适合存储诸如用户密码等安全敏感信息。你应该始终使用char数组来收集和存储安全敏感信息。”
所以你的`SecureString`将有一个私有的`char[]`,并且在销毁时将对数组进行清零处理。我相信.NET的`SecureString`在不使用字符串时会掩盖它(我不认为这是真正的加密,但我可能错了)。因此,您还需要提供一个掩码函数。

同意这就是 .Net 中 secureString 所做的事情。但我的问题与调用 SOAP 服务有关,其中方法中的一个参数是 SecureString 类型。生成的存根类实际上是空的,因此我无法构造参数。甚至不能从 char[] 构造。如果我正在调用一个我掌控的服务,我一定会将参数更改为 char[]。 - Dhawalk
我的错。我是通过“安全”标签进入这个问题的。也许你可以使用适当的标签(例如WPF、COM或WSDL等)来吸引相关人员参与。我不太了解网络技术,所以不确定。 - jww
1
但是垃圾收集器不能移动任何数据,包括字符数组吗?因此,密码仍可能保留在内存中的原始位置,对吗? - panzi
在这篇文章下,Stanimir Simeonoff有一个关于String vs char[]安全性的非常好的评论:http://securesoftware.blogspot.cz/2009/01/java-security-why-not-to-use-string.html - Quark
@jww SecureString使用DPAPI加密其内容。加密由操作系统完成,同时管理对称加密密钥。 - Tyree Jackson
Elasticsearch似乎有一个实现:https://static.javadoc.io/org.elasticsearch/elasticsearch/6.1.1/org/elasticsearch/common/settings/SecureString.html - Niccolò

0
经过更多的研究,我可以说,.Net 中的 SecureString 类型不可互操作。我已经向服务提供商提出了请求,编写一个以 char[] 作为参数的服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接