- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在对密码进行哈希处理时遇到问题。
以下代码尝试通过 jsf-Page 登录服务器,但是当调用方法登录时,底层数据库上的密码哈希值会发生更改。我使用的是 9.2 版本的 postgresql 数据库我不明白为什么。有人可以帮忙吗?
jsf 页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"` "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF8" />
</h:head>
<body>
<h1>Login</h1>
<div id="container">
<h:form id="create">
<h:commandButton id="create" value="create"
action="#{login.create()}">
</h:commandButton>
</h:form>
<h:form id="loginForm">
<h:panelGrid columns="2">
<h:outputLabel>Username:</h:outputLabel>
<h:inputText value="#{username}" />
</h:panelGrid>
<h:panelGrid columns="2">
<h:outputLabel>Password:</h:outputLabel>
<h:inputText value="#{password}" />
</h:panelGrid>
<h:commandButton id="login" value="Login"
action="#{loginController.login(username, password)}">
</h:commandButton>
</h:form>
<h:form id="response">
<h:panelGrid columns="2">
<h:outputLabel>Response:</h:outputLabel>
<h:outputLabel value="#{login.username}" />
</h:panelGrid>
</h:form>
</div>
</body>
</html>
登录 Controller :
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.ManagedBean;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import de.lps.entities.User;
import de.lps.server.interfaces.ILPSServerUser;
import de.lps.server.server.LPSServer;
@Named("loginController")
@SessionScoped
public class LoginController implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EJB(beanInterface=ILPSServerUser.class)
private ILPSServerUser server;
private Logger logger;
String username;
public void login(String username, String password) {
this.logger = Logger.getLogger("LoginController");
this.logger.log(Level.INFO, server.toString());
if (username != "" && password != "") {
User user = server.login(username, password);
if (user == null) {
this.logger.log(Level.INFO, "user == null");
this.username = "User N.A";
} else {
this.logger.log(Level.INFO, "got user");
this.username = user.getUserName();
}
} else {
this.logger.log(Level.INFO, "No credentials were given");
this.username = "No credentials were given";
}
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
}
被调用的EJB:
package de.lps.server.server;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import de.lps.entities.User;
import de.lps.server.interfaces.ILPSServerUser;
import de.lps.utils.security.PasswordHash;
/**
* Session Bean implementation class LPSServer
*/
@Stateful
public class LPSServer implements ILPSServerUser {
private User loggedUser;
@PersistenceContext
EntityManager em;
Logger logger = Logger.getLogger(LPSServer.class.getPackage().getName());
/**
* Default constructor.
*/
public LPSServer() {
// TODO Auto-generated constructor stub
}
@Override
public User login(String username, String password) {
if (loggedUser == null) {
User user = em.find(User.class, username);
if (user != null) {
if (PasswordHash.comparePasswordWithHash(password,
user.getPassword())) {
loggedUser = user;
logger.log(Level.INFO, "Loggedin successfull | username="
+ username);
return loggedUser;
}
logger.log(Level.WARNING, "GIVEN_PASSWORD_HASH[ "
+ PasswordHash.hash(password)
+ " ] SAVED_PASSWORD_HASH[ " + user.getPassword()
+ " ]");
logger.log(
Level.INFO,
"Not logged in due wrong password| username="
+ user.getUserName());
} else {
logger.log(Level.INFO,
"Not logged in due wrong username| username="
+ username);
}
}
else{
return loggedUser;
}
return null;
}
@Override
public void logout() {
// TODO Auto-generated method stub
logger.log(Level.INFO, loggedUser.getUserName() + " logged out");
this.loggedUser = null;
}
@Override
public void createUser(String username, String password) {
// TODO Auto-generated method stub
User user = new User();
user.setUserName(username);
user.setPassword(password);
em.persist(user);
logger.log(Level.INFO, "User created");
}
}
密码哈希方法:
package de.lps.utils.security;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class PasswordHash {
/**
*
* @param password
* @return returns the md5-hash of the password if the password == null returns null
*/
public static String hash(String password){
if(null == password){
return null;
}
MessageDigest sha256;
try {
sha256 = MessageDigest.getInstance("SHA-256");
byte[] passBytes = password.getBytes("UTF-8");
byte[] passHash = sha256.digest(passBytes);
return DatatypeConverter.printHexBinary(passHash);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
/**
* Compares a specified password with a specified hash
* @param password
* @param hash
* @return return true when hash and password are equals
*/
public static boolean comparePasswordWithHash(String password, String hash){
if(hash(password).equals(hash)){
return true;
}
return false;
}
}
实体用户:
package de.lps.entities;
import java.io.Serializable;
import java.lang.String;
import javax.persistence.*;
import de.lps.utils.security.PasswordHash;
/**
* Entity implementation class for Entity: User
*
*/
@Entity
@Table(name = "lps_user")
public class User implements Serializable {
private String userName;
private String password;
private static final long serialVersionUID = 1L;
public User() {
super();
}
@Id
@Column(name = "username")
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "password", length=1000)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = PasswordHash.hash(password);
}
}
感谢您的帮助,并对我糟糕的英语水平表示歉意
最佳答案
发生这种情况是因为当您尝试从数据库加载 User
实例时,您的 EntityManager
将使用 User#setPassword(String)
setter 设置从表中获取的password
的值。这将重新计算密码哈希,因此您不会得到原始哈希,而是哈希的哈希。
您应该在 setter 方法之外对密码进行哈希处理。
关于java - 哈希差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844829/
我从NVIDIA手册Eg中复制了以下代码:__threadfence()。他们为什么有 在以下代码中使用了__threadfence()。我认为使用__syncthreads()而不是__thread
我在使用 SVN 更改列表和 svn diff 时遇到了一些麻烦.特别是我想获取特定修订范围的特定文件列表的更改历史记录。 SVN 变更列表似乎是完美的解决方案,所以我的方法是: svn change
我有两个 IP 地址列表。我需要将它们合并到三个文件中,交集,仅来自 list1 的文件和仅来自 list2 的文件。 我可以用 awk/diff 或任何其他简单的 unix 命令来做到这一点吗?如何
假设自上次更新(恢复)到我的 a.b 文件以来我做了一些更改。 此 a.b 文件也在存储库中更改。 现在我想将我所做的更改与 repos 更改进行比较。 如果我 svn revert 文件,我可以看到
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我使用的是 openssl 1.0.1c , linux x86_64 我正在创建包含“hello”的文件(没有换行符) openssl dgst -sha256 hello_file i get :
假设我们有几个库。 有什么区别核心和 普通 图书馆?他们应该如何被认可,我们是否组织了两者的职责? +Common -Class1 +Core -Class2 +Lib1 has : Comm
如何在 SQLite 中计算以毫秒为单位的最小时间间隔? 好的,提供一些背景信息, 这是我的 table 的样子: link_budget table 所以有这个时间列,我想发出一个请求,以毫秒为单位
我想知道,乐观并发控制 (OCC) 和多版本并发控制 (MVCC) 之间的区别是什么? 到目前为止,我知道两者都是基于更新的版本检查。 在 OCC 中,我读到了没有获取读取访问锁的事务,仅适用于以后的
说到 SignalR,我有点菜鸟。刚刚开始四处探索和谷歌搜索它,我想知道是否有人可以向我解释完成的事情之间的一些差异。 在我见过的一些示例中,人们需要创建一个 Startup 类并定义 app.Map
我在 Ogre 工作,但这是一个一般的四元数问题。 我有一个对象,我最初对其应用旋转四元数 Q1。后来,我想让它看起来好像我最初通过不同的四元数 Q2 旋转了对象。 我如何计算四元数,该四元数将采用已
我了解 javascript 模块模式,但我使用两种类型的模块模式,并且想从架构 Angular 了解它们之间的区别。 // PATTERN ONE var module = (function()
我有两个具有完全相同键的 JSON。 val json1 = """{ 'name': 'Henry', 'age' : 26, 'activities' : {
我发现使用 VBA 在 Excel 中复制单个文件有两种不同的方法。一是文件复制: FileCopy (originalPath), (pathToCopyTo) 另一个是名称: Name (orig
我想知道查找两个 float 组之间差异的绝对值的最有效方法是什么? 是否是以下内容: private float absDifference(float[] vector1, float[] vec
我有一个关于 wicket getApplication 的问题。 getApplication() 和 getSession().getApplication 有什么区别? 部署 wicket 应用
我刚刚开始使用activemq,我有一个关于追溯消费者的问题,为了启用这个功能,你需要有一个持久的订阅。但是在主题上启用和不启用追溯的持久订阅有什么区别? activemq 文档说。 http://a
我有两个具有完全相同键的 JSON。 val json1 = """{ 'name': 'Henry', 'age' : 26, 'activities' : {
得到另一个 Erlang 二进制表示查询('因为这就是我最近正在阅读的内容,并且需要二进制协议(protocol)实现)。 如果我正确理解了类型说明符,那么对于“浮点”类型值,8 字节表示似乎很好(这
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我是一名优秀的程序员,十分优秀!