Java 数据库中的密码散列
我使用Tomcat在EclipseJava中为我的web应用程序创建了登录页面,它正在运行。我还与Oracle数据库建立了连接。现在我想散列我的密码,让我的应用程序比较通过键盘输入的密码的散列码和来自数据库的密码(如果散列码相等,则密码是正确的)。我用Java编写了一些密码散列代码Java 数据库中的密码散列,java,eclipse,hash,Java,Eclipse,Hash,我使用Tomcat在EclipseJava中为我的web应用程序创建了登录页面,它正在运行。我还与Oracle数据库建立了连接。现在我想散列我的密码,让我的应用程序比较通过键盘输入的密码的散列码和来自数据库的密码(如果散列码相等,则密码是正确的)。我用Java编写了一些密码散列代码 你能帮我想一想,我该怎么做才能在我的数据库中保存哈希代码吗?如何存储哈希密码?您可以将哈希密码存储为数据库中的varchar列 典型的哈希算法返回字节数组。例如,Java的MessageDigest: byte[
你能帮我想一想,我该怎么做才能在我的数据库中保存哈希代码吗?如何存储哈希密码?您可以将哈希密码存储为数据库中的varchar列 典型的哈希算法返回字节数组。例如,Java的
MessageDigest
:
byte[] digest = messageDigest.digest();
你可以随意储存。您还需要存储:
- 盐,如果用的话(你应该用)
- 一个“版本号”,用于标识您使用的哈希算法。
- 这样一来,如果有一天你改变了算法,你就知道该选择哪一个了 在旧条目上使用
hash varbinary
,salt varbinary
,version integer
但是,将这三个变量编码为一个varchar是很常见的:
- 版本为2个字符(十六进制数)
- salt的固定字符数(十六进制或base64-宽度取决于您的算法,并随版本而异)
- 哈希的固定字符数(十六进制或base64)
将编码为可打印的ASCII字符可以方便地查看数据、以您选择的协议进行传输等。您可以从显示到目前为止的数据开始。此外,密码是字符串,散列也是字符串,所以存储散列而不是普通字符串有什么问题?在散列中你应该考虑的一件事(不是直接链接到你的问题):添加静态和动态的盐来提高散列的安全性。不幸的是,你的问题归结为“有人请帮我解决这个问题”。但我们不认为此类请求是本网站范围内的问题。请仔细阅读以了解原因。然后考虑删除这个问题,并在这个社区范围内提出一个新的、更精确的问题。或者,您可以修改并改进此问题。谢谢你们在使用J2EE认证吗?@GhostCat:对于一般性问题,并没有太多具体的答案。该应用程序需要将密码存储在数据库中(如果Dora愿意实施的话,还需要将密码存储在salt中。)事实上,这个问题涉及面很广,我们不知道到底是什么困扰着作者。@BCrypt哈希的一个很小的例子:
$2a$04$ikuprq9tq7Kd2x3yHrdJ8uHd8Vr5EOfHKEa2Zazg/52iVn2fwd5M
。这不是一个整数:它是一个$
后跟版本,2a
,后跟一个分隔符$
,后跟轮数04
,后跟一个分隔符$
,后跟散列。我会强烈地考虑使用这个字符串,而不是尝试多个它。