Java中的.Net SecureString

时间:2014-03-25 20:18:06

标签: java wcf wsdl axis securestring

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

AuthResult Login(string username, SecureString passkey)

我的应用程序是用Java编写的,我可以使用Java中的SecureString没有兼容类型:(当我生成一个轴代理时,它生成一个没有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/,但我不是很有希望

任何人都可以帮我解决这个互操作性问题吗?我正在寻找一种方法将类型为secureString的参数从Java应用程序代码发送到.Net服务。

3 个答案:

答案 0 :(得分:2)

  

...我的应用程序是用Java编写的,Java中的SecureString没有兼容的类型

     

......任何人都可以帮我解决这个互操作性问题吗?

如您所知,Java中没有SecureString

在Java中,您应该使用char[]并在完成后覆盖材料。来自Java Cryptography Extension(JCE)参考指南中的Using Password-Based Encryption

  

在对象中收集和存储密码似乎是合乎逻辑的   类型为java.lang.String。但是,请注意以下事项:Objects   类型String是不可变的,即没有定义的方法   允许您更改(覆盖)或清零String的内容   使用后。此功能使String个对象不适合   存储安全敏感信息,如用户密码。您   应始终收集并存储安全敏感信息   改为char数组。

因此,您的SecureString将拥有私有char[],您将在销毁时将数组归零。我相信.Net的SecureString在不使用时屏蔽了字符串(我不相信它真正的加密,但我可能错了)。所以你也需要提供一个掩码功能。

答案 1 :(得分:1)

完全。 SecureString不是可序列化的类型。它永远不会跨越机器,因为SecureString依赖于DPAPI,DPAPI本身依赖于本地机器属性来构建它的加密密钥/向量。

使用SecureString -type参数发布API的事实显示了其设计中的重要缺陷。没有远程客户端可以将该参数传递给。

答案 2 :(得分:0)

经过更多研究,我可以说。SecureString的.Net类型不可互操作。我已将请求发送给服务提供商,以编写以char[]为参数的服务。