0

我的 .jsp 页面上有一个表单,它将密码发送回服务器。

<form name="login" action="j_security_check" method="post">
    <input type="text" name="j_username">
    <input type="password" name="j_password">
    <input type="submit" name="Login"> </form>

我想在处理 j_password 之前对其进行一些处理。以前,我通过调用执行类似于以下操作的函数,通过一些处理代码实现 JavaScript 来做到这一点:

<script type="text/javascript" src="sha256.js">
<script> function hash() { document.login.j_password.value = '@' +
    sha256_digest(document.login.j_password.value); } </script>
...
...
    <input type="submit" value="Login" onClick="hash()"> </form>

现在,我正在尝试实现类似的功能,但我尝试使用 Java,而不是使用 JavaScript。我的 .java 的主要目的是加载 public.key,获取 j_password,执行加密,并将 j_password 替换为其加密形式。

// RSA.java Pseudocode
1) Get string from textbox "j_password"
2) Load public key from public.key
3) Perform encryption on j_password with key
4) Load cipher to textbox "j_password"

但是,我看到的大多数示例都实现了“<% %>”调用,但这给我的印象是它会在页面加载时执行,而不是在单击登录按钮时执行。我还注意到我可以使用 javac 将其编译为 .class 并将其加载为“”,但是可以使用此方法修改 j_password 的输入吗?虽然它是一个 .jsp 并且我可以使用“<% %>”直接实现 Java,但我认为它在当前的 JSP 标准中是不可接受的。有没有人有任何建议或想法可以为我指明正确的方向?

谢谢你。

4

2 回答 2

0

您可以使用过滤器进行加密,但它不会在客户端。正如您在该列表中看到的那样,过滤器也用于加密,就像您需要的目的一样。干预某事的唯一方法是使用过滤器。但是如果你需要客户端加密,唯一的出路就是 JavaScript。

此外,您可以查看thisthis

第二个链接很好地解释了在客户端散列密码。其中一个答案提到了这一点:

对于这个问题,更安全的身份验证协议通常会跳过许多环节,以确保这种重放攻击不起作用,通常是通过允许客户端选择一堆随机位,这些位与密码一起散列,并且还以明文形式提交给服务器。

在服务器上:

  • 生成一些随机数
  • 将这些位(以明文形式)发送给客户端

在客户端:

  • 生成一些随机位
  • 连接密码、服务器的随机位和客户端的随机位
  • 生成上述哈希
  • 向服务器提交随机数据(以明文形式)和散列

由于服务器知道自己的随机信息以及客户端的随机位(它以明文形式获取它们),因此它可以执行基本相同的转换。该协议确保,只要双方每次生成不同的“噪声位”,任何人都可以在以后使用该信息来使用记录的信息进行虚假身份验证(除非使用了非常弱的算法......),进行握手。

于 2012-05-14T07:46:53.577 回答
0

您是否尝试加密密码以提交到服务器?如果是这样,您不能使用 JSP,因为处理是在服务器上执行的,而不是在客户端上执行的。

JSP 是一种使用 Java 构建动态网页的方法,但所有处理指令都被转换为 servlet,然后它们遵循常规的 servlet 生命周期。如果要在客户端加密,则需要使用客户端语言。请记住,如果您使用 SSL 交付/接收您的提交,数据加载将自动加密。

如果您要将存储转换为数据库,那么您最好为表单处理程序使用标准 servlet。

于 2012-05-14T07:47:09.450 回答