求教:Java 用户的密码该怎么加密存储?以及登陆密码加密?

蓝水晶飞机 发布于 2017/03/01 10:18
阅读 6K+
收藏 1

没有做过用户密码加密的方案,之前做的小系统都是直接明文存储,但是为了用户着想,为了安全着想,还是需要把用户的密码绝对的加密,不希望任何人知道。

疑问:

1、用户表的密码直接用哈希加密? 不加盐或者加盐?加盐就在表里面存储盐值吗?

2、Web登陆,使用Crypto-JS加密用户的密码再发送请求,期间,用户的密码加盐了怎么处理?

3、疑问:用户重设密码的时候传递的应该是是明文密码还是密文密码,如果你相信客户端了,客户端传递过来的不是真密文,用户登录时还是可以绕开你的加密,使用和设置一样的明文进行登录。

4、怎么样真正保证用户登录密码的安全。

加载中
0
乌龟壳
乌龟壳

看下 @罗格林@jfinal 最近的一些动态

蓝水晶飞机
蓝水晶飞机
回复 @乌龟壳 : 谢谢
乌龟壳
乌龟壳
回复 @蓝水晶飞机 : 这么经典的问题别人已经做了很细致的研究了
乌龟壳
乌龟壳
https://my.oschina.net/greenlaw110/blog/845162
乌龟壳
乌龟壳
http://www.oschina.net/news/49852/salted-password-hash
蓝水晶飞机
蓝水晶飞机
哈哈,朋友你有思路可以分享一下吧?
0
苍穹自由无限
苍穹自由无限

真正是很难保证的,黑客想搞你,你很难躲。我就说一下我的想法吧(也是以前看了一些博客,事实什么的还得楼主自己判断),现在我们也在为安全问题烦劳。。。

1.加密有很多方法,可以自己去找一个框架加密(比如shiro做权限的就有加密的功能),盐值一般是需要的,为了加大字典破解的难度,但是如果加了盐值,如果为了更安全,盐值一般是单独存放一个表的和用户表是不在一起的;

2.你前端用什么加密,到后台再用什么解密吧,加盐值就算了吧,这样折腾起来应用复杂了,但是安全性并不见的高,其实很多时候也就能防止一般的人或者一般的黑客或者常规的手段;

3.这个不是很懂。。

4.网络没有什么真正的安全,相对安全罢了,

蓝水晶飞机
蓝水晶飞机
我的主要目的: 1、保护登录密码,窃取流量拿不到用户的密码(暂无HTTPS)。 2、保护数据库的密码,加大从数据库窃取密码的难度,即使被入侵了数据库也无法简单的获得用户密码。
0
WeiXiaodong
WeiXiaodong

直接加密就是了 ,反正也不用解密的

0
Kingviker
Kingviker

前端用js加密的意义何在? 黑客连网页的js都看不懂还当黑客? ,个人认为意义不大网络包劫持的话有可能有点用但是用处还是不大.后台不要明文保存密码,找一个不可逆的加密算法 保存到数据库即可.用户传过来账号密码,把密码用不可逆的算法转换一下 对比一下 一样就登陆呗.

其他的措施 只是增加黑客破解的时间和复杂度.起不到多大作用.可以对登陆ip做统计 单位时间内登陆重试次数限制.

就像楼上说的 不论到哪里 都是爱因斯坦大爷的一句话 万物相对论.没有绝对

蓝水晶飞机
蓝水晶飞机
是的啊,前端加密算法都是公开的,密钥什么都不可避免被人看到,嗯,JS加密只是保护在传输过程中而已,如果没卵用那就只能依赖于HTTPS保护了。 谢谢你的指教。
0
爱趴趴的呆呆

我做过类似的模块,我的思路如下:

1,密码用的是md5加密到数据库存储的,建议加盐(最好是随机盐)加密,盐可以放在数据库的每个用户信息内,用的时候取出来,看到你有关注shiro,shiro自带的Md5Hash方法,你可以看一下,盐是直接加在要加密的字符串前,之后进行了md5加密的(我这边是自己看的是的,如果不是的自己看源码吧,记得不太清了)

2,关于前台Crypto-JS加密传输到后台的部分,我是这样做的,每次传输的时候,进行了再加一次随机盐的方式,前台想办法先进行了一次md5加密,计算出数据库中存储的密文,再加上从后台再次获取的随机盐进行一次md5计算,传输计算后的加密密文,后台拿到了前台传送的计算密文后,后台拿到数据库存储的加密密文,加上前台之前获取的随机盐(放在session里面,用完记得清除,防止别人可二次使用)进行md5加密,比较2者的加密的结果,相同的就是密码正确的,这样每次传输的验证密码密文都是不一样的;如果你说在浏览器加密,会不会被被人看到或获取到,那我只能说,你浏览器都被别人控制了,人家直接获取你的输入,你再怎么加密都没有用

3,用户重设密码的时候,你自己可以想个办法啊,采用一个可用密钥解密的算法,浏览器端进行加密,后端进行解密获取加密的明文,加密的密钥可以采用类似原密码字符串,用户进行密码重设的时候要求用户输入原密码,记得这个不要出现在传输数据中,只传输加密后的密文,一切相关原始密码的明文信息都不要在网络传输过程中出现(尽量吧)

4,建议可以采用密码控件,还有网站采用https进行加密传输,要不然,你登录后,如果被别人监听传输,别人拿到你的cookie,或者其他的可进行回话验证的信息,还是可以冒充你的身份进行非法操作,目前相关的了解有限,只知道这些,有好的希望可以进行分享学习

 

蓝水晶飞机
蓝水晶飞机
很详细,感谢分享!
0
公孙二狗
公孙二狗

用 BCrypt 可以省掉自己加盐

import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
public class EncryptPassword {
    @Test
    public void encrypt() {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        for (int i = 0; i < 5; ++i) {
            // 每次生成的密码都不一样
            String encryptedPassword = passwordEncoder.encode("Passw0rd");
            System.out.println(encryptedPassword);
            System.out.println(passwordEncoder.matches("Passw0rd", encryptedPassword)); // true
            System.out.println(passwordEncoder.matches("Password", encryptedPassword)); // false
        }
    }
}

输出

$2a$10$l7vPVeqwb9GiVjURV5J2QO1CM5qxwk00/Ra5qEog0WgP7O5XV0Ble
true
false
$2a$10$jeyMfHF88mNJb9v.mQ7YiuZ8oTU.pHaiKdT1NLOM38eXj7heHZHg2
true
false
$2a$10$ux43/3JcHUC1hszyoJaH0eQhv7LkIVfL7p1cW80WxfxeTr2dUY6kO
true
false
$2a$10$KdUmhaJOJ30klEcKiYT25.fIRPrMs4xONHOQh4JvmpKSjJ8d9.QKG
true
false
$2a$10$gQKUOoFuevnCkoej3.AvAO9YzHKCKYmKuiSfEGHL22piY2FfNDQYu
true
false

 

蓝水晶飞机
蓝水晶飞机
回复 @公孙二狗 : 是的呢,这样子密钥就不用管了。
公孙二狗
公孙二狗
回复 @蓝水晶飞机 : 保存生成的任意一个就可以,每次用同样明文生成的不同密文和保存的那个都能匹配上,这就是神奇的地方。
蓝水晶飞机
蓝水晶飞机
用一次换一次,意义何在呢?
0
JFinal
JFinal

事情搞简单,用一下 jfinal 中的 HashKit 来做就下面两条:

1:  注册时先生成 salt 与 hashedPass,存入数据库

salt = HashKit.generateSaltForSha256();

hashedPass = HashKit.sha256(salt + 密码明文);

2:登录时,根据 userName 得到一条数据,用上面的逻辑进行验证

蓝水晶飞机
蓝水晶飞机
谢谢@jfinal
0
wanglu_bj
wanglu_bj
/**
 * 生成安全的密码,生成随机的16位salt并经过1024次 sha-1 hash
 */
public static String entryptPassword(String plainPassword) {
   byte[] salt = Digests.generateSalt(SALT_SIZE);
   byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS);
   return Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword);
}
0
烨儿
烨儿

他的盐是存储在密码中的.所以不用去单独去记录盐的编码.

0
桌力

user 表password存的是加密密码 然后用户登录时输入的密码进行同样的加密 对比2个加密后的密码是否一样 

返回顶部
顶部