Java中的.Net SecureString
我正在尝试在客户站点上使用第三方身份验证web服务。web服务是用.Net编写的,并接受SecureString作为密码类型Java中的.Net SecureString,java,wcf,wsdl,axis,securestring,Java,Wcf,Wsdl,Axis,Securestring,我正在尝试在客户站点上使用第三方身份验证web服务。web服务是用.Net编写的,并接受SecureString作为密码类型 AuthResult Login(string username, SecureString passkey) 我的应用程序是用Java编写的,Java中没有可使用的SecureString兼容类型:(当我生成axis代理时,它会生成一个没有SecureString成员的存根,因此我无法对服务进行身份验证调用 public class SecureString imp
AuthResult Login(string username, SecureString passkey)
我的应用程序是用Java编写的,Java中没有可使用的SecureString兼容类型:(当我生成axis代理时,它会生成一个没有SecureString成员的存根,因此我无法对服务进行身份验证调用
public class SecureString implements java.io.Serializable {
public SecureString() {
...
}
}
我正在努力,但我不是很有希望
有人能帮我解决这个互操作性问题吗?我正在寻找一种方法,将secureString类型的参数从Java应用程序代码发送到.Net服务
…我的应用程序是用Java编写的,Java中没有与SecureString兼容的类型
…有人能帮我解决这个互操作性问题吗
正如您所知,Java中没有SecureString
在Java中,您应该使用char[]
并在使用完材料后覆盖该材料。在《Java加密扩展(JCE)参考指南》中:
在对象中收集和存储密码似乎是合乎逻辑的
类型为java.lang.String
。但是,这里有一个警告:对象的
类型String
是不可变的,即没有定义
允许您更改(覆盖)或归零字符串的内容
使用后。此功能使String
对象不适合
存储用户密码等安全敏感信息。您可以
应始终将安全敏感信息收集并存储在
而不是字符数组
因此,您的SecureString
将有一个私有char[]
,您将在销毁时将数组归零。我相信.Net的SecureString
在不使用时会屏蔽字符串(我不相信它的真正加密,但我可能是错的)。因此,您也需要提供掩码功能。经过进一步研究,我可以说.Net类型的SecureString
是不可互操作的。我已向服务提供商发出请求,要求编写一个使用char[]的服务
作为参数。完全正确。SecureString不是可序列化的类型。它永远不能跨机器序列化,因为SecureString依赖于DPAPI,而DPAPI本身依赖于本地机器属性来构造其加密密钥/向量
API发布时带有SecureString类型的参数这一事实表明其设计中存在一个重大缺陷。远程客户端不可能将该参数提交。您应该能够使用常规字符串。我无法控制服务您到底在寻找什么?从“如何克服此互操作性问题”中不清楚.ASecureString
在Java中的实现?或具有与C#SecureString
相同方法的实现?或关于在Java中实现的指导?以下内容可能会有所帮助:同意,SecureString在.Net中就是这样做的。但我的问题涉及调用SOAP服务,其中方法中的一个参数类型为SecureString。生成的存根类实际上是空的,因此我无法构造参数。甚至不能从char[]中构造参数。如果我调用的是我控制的服务,我肯定会将参数更改为char[]My bad。我在其上的“security”标记后面提出了一个问题。也许你可以让合适的人参与到相应的标记中(可能是WPF或COM或WSDL或类似的?)。我不太了解web技术,所以我不知道。但是GC不能移动任何数据,包括字符数组吗?那么密码不可能保留在内存中的原始位置吗?关于字符串与字符[],有一个非常好的注释本文中Stanimir Simeonoff提供的安全性:@jww SecureString使用DPAPI加密其内容。加密由操作系统完成,该操作系统还管理对称加密密钥。