我正在尝试在客户站点使用第三方身份验证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服务。
答案 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[]
为参数的服务。