我们在应用程序中使用消息传递队列(JMS / ActiveMQ),以促进客户端应用程序和服务器应用程序之间的通信。尝试调用服务器应用程序的用户的用户名和密码将作为发送到队列的每条消息的一部分从客户端发送。我们希望通过以下方式保护用户凭据(至少是密码):
简单地在客户端屏蔽密码并在服务器端取消屏蔽它是不够的,因为有人可以从日志文件或管理控制台拦截屏蔽的密码,用恶意数据创建新消息,然后发送恶意将在服务器端取消屏蔽并执行的消息。在客户端和消息队列之间使用安全通道会存在同样的问题,因为管理控制台仍然会公开密码(是否有掩码)。
在没有任何人(甚至是消息代理管理员)看到数据的情况下,是否存在从客户端到服务器管理此类数据隐藏/屏蔽的任何模式?
答案 0 :(得分:1)
一种解决方案是拥有共享密钥,然后加密密码。为了防止重放攻击,请阅读Nonce的内容:http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/cwbs_noncev6.html。
Example 1:
Client Sends:
Encrypt(username + password + timestamp)
Timestamp
Server:
Decrypt to get username, password, timestamp
compare timestamp in encrypted data == unencrypted timestamp
if timestamp older than N, then reject
This disallows replay attacks outside of the timestamp +- N window.
Example 2:
Client Sends:
Encrypt( username + password + Nonce )
Server:
Decrypt to get usernmae, password, Nonce
check if Nonce was used before (for this username )
if it was, then reject