exception - 使用 EclipseLink 和 PostgreSQL 存储 SHA-1 哈希

标签 exception postgresql jpa eclipselink sha1

我正在使用 eclipselink 作为 JPA 实现和 PostgreSQL,并希望将 SHA-1 哈希存储在数据库中。 但是我遇到了这样的异常:

Internal Exception: org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Error Code: 0 Call: INSERT INTO mbm_user (USERNAME, PRENAME, LASTNAME, PASSWORD) VALUES (?, ?, ?, ?) bind => [Hans, null, null, THE SHA-1 HASH]

SHA-1 哈希是一些乱码,我无法将它们粘贴到这里。

我的实体:

@Entity
@Table(name="mbm_user")
public class User extends CanAccessBook{

  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(nullable = false)
  private Long id;

  @Column(nullable = false)
  private String username;

   @Column(nullable = false)
   private String password;

   private String prename;

   private String lastname;
       ...
       ...
}

以及我生成 SHA-1 哈希的方法:

    public void setPassword(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] encryptPassword = md.digest(password.getBytes());
        this.password = new String(encryptPassword);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

我怎样才能避免使用非法字符 0x00 还是其他地方的问题?

最佳答案

您正试图将一个 byte[] 塞进一个字符串中,这永远不会很好地工作。

  1. 将 SHA-1 散列保存为一个 blob。在我的脑海中:
    @Lob
    @Column(nullable = false)
    private byte[] passwordHash;
  1. 将二进制数据编码为文本表示形式,可以是十六进制字符串,也可以是 Base64 之类的东西。谷歌 binaryToHexString 或 base64encoder,这应该会让你走上正轨。

关于exception - 使用 EclipseLink 和 PostgreSQL 存储 SHA-1 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265185/

相关文章:

hibernate - 如何注释 id 使其在没有 SEQUENCE 表的情况下自动递增?

java - 为什么 JPA 元模型中的所有字段均为空?

java - 让客户端有选择地处理 Java 中的错误的模式

delphi - 是否可以使用 JclDebug 从引发异常的方法中获取参数值?

asp.net - 带有 PostgreSql 的 ASP Core 1。授权和认证

database - 如何将值插入 PostgreSQL 11.1 中的标识列

c++ - C++ 异常会安全地通过 C 代码传播吗?

python - 如果不立即重新引发异常回溯,则隐藏

java - 将 Java 连接到 PostgreSQL 时强制 TZ?

java - 多个@ElementCollection映射到同一个表的不同列