【问题标题】:Java - save and/or retrieve a byte from an sql databaseJava - 从 sql 数据库中保存和/或检索一个字节
【发布时间】:2018-05-24 16:26:22
【问题描述】:

我现在知道,密码只是保存在数据库中, 但我希望将其保存为加密的字节数组(例如 [@7aC&s )。 我将密码设置为 varbinary,但是当我尝试使用 getBytes() 方法将密码保存为 byte[] 时,它检索了 [@7aC&s 作为字符串而不是 byte[]。 我想这样做,然后我可以使用 new String(byte[]) 将其解密回字符串。

我该怎么做,还是根本不做?
编辑: 如果你想知道新的 MySQLConnnector();是,这里是:

【问题讨论】:

标签: java mysql sql arrays


【解决方案1】:

首先,您不应该将您的查询和一些用户输入连接起来。这为 SQL 注入打开了大门。您需要使用PreparedStatement 来安全地插入数据(阅读链接的页面以对该部分进行全面审查)。

PreparedStatement 提供setBytes 方法,允许您插入byte[] 作为值。

将指定参数设置为给定的 Java 字节数组。驱动程序在将其发送到数据库时将其转换为 SQL VARBINARY 或 LONGVARBINARY(取决于参数的大小相对于驱动程序对 VARBINARY 值的限制)。

这是一个使用虚拟表的快速未经测试的代码

String sql = "insert into mytable(bytearray) values (?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setBytes(1, "MyPassword".getBytes());
ps.execute();

【讨论】:

    【解决方案2】:

    您应该创建一个 PreparedStatement 并使用 setBytes (https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setBytes-int-byte:A-)。但是,我建议您在自己动手之前阅读安全性。 25 字节是密码的缩写,就目前而言,您的代码对 SQL 注入是开放的。例如,看看https://projects.spring.io/spring-security,它为这些东西提供了经过测试的代码。

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2021-05-07
      • 2013-04-22
      • 2011-02-20
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多