5

我正在尝试在客户站点使用第 3 方身份验证 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 服务的方法。

4

3 回答 3

3

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

使用 SecureString 类型参数发布 API 的事实表明其设计存在重大缺陷。没有远程客户端可以提交该参数。

于 2017-10-03T03:00:50.570 回答
2

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

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

如您所知,SecureStringJava 中没有。

在 Java 中,您应该在char[]完成后使用并覆盖该材料。从Java Cryptography Extension (JCE) Reference Guide 中的Using Password-Based Encryption开始:

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

因此,您SecureString将拥有一个 private char[],并且您将在销毁时将数组归零。我相信 .NetSecureString在不使用时会掩盖字符串(我不相信它的真正加密,但我可能是错的)。所以你也需要提供一个掩码函数。

于 2014-03-25T23:29:13.683 回答
0

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

于 2014-04-08T21:23:49.810 回答