当前位置: 首页 > 面试题库 >

用Java执行认证加密的正确方法是什么?

訾俊名
2023-03-14
问题内容

认证加密要求我们使用某种可接受的标准来加密和认证消息。因此,我们既对消息进行了加密,又对消息进行了计算以验证其未被篡改。

此问题概述了一种执行基于密码的密钥加强和加密的方法:

/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

但是据我所知,这不会在密文上计算任何MAC,因此是不安全的。在Java中执行身份验证加密的公认标准是什么?


问题答案:

我建议使用GCM模式加密。默认情况下,它包含在最新的JDK(1.7)中。它使用计数器模式加密(流密码,无需填充)并添加身份验证标签。一个很大的优点是它只需要一个密钥,而HMAC将另一个密钥添加到混合中。Bouncy
Castle也有一个实现,与Oracle提供的实现兼容。

GCM模式加密在TLS RFC和XML加密1.1中都有(两者都不是最终的)。GCM模式提供所有三个安全功能:数据发送的机密性,完整性和真实性。该字符串将是“
AES / GCM / NoPadding”,而不是您现在正在部署的CBC。如前所述,请确保您具有Oracle的最新JDK,或者已安装Bouncy
Castle提供程序。

还要在这里查看我的答案,该答案主要是关于String编码的,但是我也成功尝试了GCM模式-请参阅注释。



 类似资料:
  • 问题内容: 我注意到Java浮点精度的一些问题 我不仅有问题,而且也有问题。 有人可以解释幕后发生的事情吗,我们如何获得准确的数字?处理这些问题时正确的方法是什么? 问题答案: 问题是精度有限。它不能完全代表。(当然,也是如此:它具有更高的精度,但仍然是有限的。) 使上述问题更加明显的另一个问题是a 而不是a ,因此您将被提升为执行减法的操作,当然,此时系统无法恢复a所丢失的精度。 本来 可以代表

  • 问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意

  • 这就是我目前拥有所有实体类的方式(此处仅显示一个以供参考) 来自lombok参考: @Data注释可能是项目Lombok工具集中最常用的注释。它结合了@ToString、@EqualsAndHashCode、@Getter和@Setter的功能。本质上,在类上使用@数据与使用默认的@ToString和@EqualsAndHashCode注释该类以及使用@Getter和@Setter注释每个字段是一

  • 我正在尝试开发一个可以与REST API一起使用的服务器后端。我想提供一个endpoint,用户在那里通过请求发送用户名和密码。在数据库中查找userdata,如果用户是有效的,则创建一个JWT令牌并通过响应发送到客户端。 对于查找,我希望使用spring Security附带的jdbc身份验证。为jdbc身份验证提供数据的正确方式是什么?我必须在请求头中写入用户名和密码吗?还是可以使用http基

  • 问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的

  • 问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提