欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

密码学2 密码安全注意

程序员文章站 2022-03-18 12:52:46
...
1.Java API支持
位于java.security包及子包中
2.Jsp容器支持
常见的应用容器通过简单的配置支持SSL/TLS,获取证书配置,有效的构建https应用。
3.Java工具支持
通过KeyTool可以很好的完成密钥管理、证书管理等;通过JarSigner可以完成代码签名。
4.第三方jar包支持
commons-codec、bouncycastle


密码在线破解
1)http://www.cmd5.com/
2)http://www.xmd5.com/
3)http://www.somd5.com/
4)https://crackstation.net/
十款最流行的破解工具
Brutus、RainbowCrack、Wfuzz、Cain and Abel、John the Ripper、THC Hydra、Medusa、OphCrack、L0phtCrack、Aircrack-NG
密码管理利器
Linux -- KeePassX   Windows -- KeePass  android – KeePassDroid
加密软件
truecrypt



保护密码措施
  • 不要使用弱口令,千万不要用明文保存密码
  • 加盐来保护密码强度
  • 归避密码找回功能的缺陷
  • 登录认证使用https协议
  • 认证凭证不可猜测性
  • 不要直接把认证凭证添加到URL来完成认证,使用cookie和post
  • 保证接口干净,app和web接口不能混用
  • 同IP不同port,尽量不要部署多个不同的web服务,因为cookie不      区分端口
  • 自动登录,绑定,退出等敏感功能,需做csrf防护,referrer+token

正确的加盐保存密码姿势
盐值应该使用基于加密的伪随机数生成器生成。( java.security.SecureRandom )
避免使用短的盐和盐的复用。(用户每次创建或者修改密码一定要使用一个新的随机的盐。)
要在服务端进行hash。
使用经过充分测试的加密hash函数,比如SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3等;设计良好的key扩展hash算法,比如PBKDF2,bcrypt,scrypt;尽量不要使用过时的hash函数,比如MD5,SHA1。


import org.junit.Test;

import java.security.Provider;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Map;

public class BasicSecretTest {

    /**
     * 生成随机数盐
     */
    @Test
    public void SecureRandomTest(){
        SecureRandom secureRandom = new SecureRandom();
        System.err.println(secureRandom.nextLong());
    }

    /**
     * 打印当前系统所配置的全部安全提供者
     */
    @Test
    public void testProvider(){
        for(Provider provider: Security.getProviders()){
            //打印提供者信息
            System.err.println(provider);
            //遍历提供者set实例
            for(Map.Entry<Object,Object> entry: provider.entrySet()){
                System.err.println("\t"+entry.getKey());
            }
        }
    }
}


密码找回功能常见利用点
密码找回凭证太弱,容易被爆破
密码找回凭证可以从客户端、URL中直接获取
密码找回凭证可以在网页源代码中直接获取
密码找回的邮箱链接易猜解,如时间的md5
密码找回凭证存并非只是与单个用户并绑定的问题。
密码找回的手机或邮箱从页面获取,可以通过firebug修改
最后提交新密码时修改用户ID为其他ID
跳过验证步骤、找回方式,直接到设置新密码页面
找回密码时没有在服务器上验证用户名与邮箱是否匹配便发送了验证码
重置密码时返回的token没有与账号以及验证码绑定
服务器只验证了对应的验证信息是否存在,没有验证是否与账号匹配
在本地验证服务器的返回信息,确定是否执行重置密码,但是其返回信息是可控的内容,或者可以得到的内容
发送短信等验证信息的动作在本地进行,可以通过修改返回包进行控制
提交新密码时的,只验证了部分可控的信息是否匹配
在找回密码处存在注入漏洞
说明:找回密码凭证够复杂并且不可猜测,任何动作放在服务器端进行,传输的验证参数做好加密,同时对参数做好过滤


完整密码学练习代码:GitHub:https://github.com/java-datas/encryptDemo






相关标签: 安全 加密