6位数支付密码安全使用


编   写:袁 亮
时   间:2017-02-13
说   明:6位数支付密码安全使用

一、目的
    1、用户可以设置6位数字的支付密码用来使用自己的账号余额
    2、确保用户的支付密码使用、存储安全
    
二、业务场景描述
    1、设置支付密码
        在相应的业务流程中,用户设置自己的支付密码
    2、使用支付密码
        在支付、提现等地方输入密码进行操作
    3、重置支付密码
        忘记密码的情况下,提供重置密码的流程
    
三、用户密码安全分类
    1、流程逻辑漏洞
        1.1 平行权限
            比如仅仅在展示页面验证了权限,但实际操作的ajax请求等未做验证之类的
            或者验证之后,存储了一个已验证通过标识,然后通过这个标识去做后续操作
        1.2 业务逻辑漏洞
            比如找回密码,直接将原密码通过邮件等方式发送给了用户
            比如找回密码的token,没有绑定用户,导致可以修改任意用户
                或者没有过期时间,或者使用过之后还能再用
    2、明文密码
        2.1 http传输
            劫持、监听、篡改、xss攻击等
        2.2 GET传输
            url中会有密码,从而导致很多地方会泄露,比如统计代码、url日志等等
        2.3 log日志记录
            开发过程中,有人会将这个数据写入到日志里,日志泄露等导致密码泄露
        2.4 客户端存储
            比较菜的情况下,会把密码这种东西写在cookie里...
            移动app中把密码记录在app里
        2.5 数据库明文存储
            内部人员能看到,后台、数据库等等
            或者api里,读取所有字段等,导致把密码泄露
            数据被人拖库或者sql注入直接显示在页面上等等
    3、撞库攻击
        3.1 弱密码
            常用弱密码库,1000个不到
        3.2 响应时间差攻击
            不同错误密码判断所需时间不同,导致跨域逐步猜测
        3.3 网上已泄露的密码库,直接撞库攻击
            多次大规模安全事故,已经有极其庞大的密码库被公开
    4、应用层攻击
        4.1 sql注入
            构造特殊参数,直接绕过判断条件
        4.2 webshell
            通过webshell拦截密码或者获取到对应的数据库数据
        4.3 服务器入侵
    5、拖库后,从hash值获取对应明文
        5.1 反向查表
        5.2 彩虹表
            优化存储空间之后的一种反向查表攻击
        5.3 暴力破解
            a. 根据hash值和密码设置规则,强行遍历所有组合的所有hash,比对已有hash是否匹配
            b. 单个 GPU 上以每秒 36.5 亿次计算的速率破解 MD5 的哈希值
                以每秒 13.6 亿次计算的速度破解 SHA-1 的哈希值
                而且很多hash算法还能被硬件加速
                
四、实施方案
    1、第一次设置支付密码
        1.1 业务流程要求
            必须登陆状态
            用户必须绑定过手机号(不然的话找回密码就不行了)
        1.2 开发注意事项
            必须https,以POST形式传输数据
            ua必须是正常的
            不能以任何形式将密码记录在服务器硬盘上,比如log日志等
            不允许存储在本地客户端,比如cookie,本地存储
        1.3 密码存储
            使用password_hash方法,将密码进行hash运算,结果存储到数据库中
            记录用户设置环境的log
                ua,x-forword-for,访问url、设置时间等等
    2、使用支付密码
        2.1 业务流程要求
            必须登陆状态
            账号需要未冻结
        2.2 开发注意事项
            必须https,POST传输
            ua必须是正常的
            支付密码必须要跟所需操作同时发送过期,内部调用验证支付密码,不允许分步来做
            支付密码后期可能会替换为指纹
        2.3 验证逻辑
            验证连续错误次数是否达到上限
            是否频繁操作,频率限制
            每天最大验证次数超出上限,异常报警(内部限制上限)
            获取用户对应password_hash,验证是否正确
            记录日志:登陆信息及是否正确等信息
            正确
                验证数据库里存储的hash是否是用最新的hash生成方式生成,如果不是,需要刷新重新写入
            错误
                错误提示
    3、重置支付密码
        3.1 业务流程要求
            用户登陆
            只能使用之前绑定的手机号发送短信验证码
                ps:现在其实是可以随时绑定新的手机号,有逻辑上的漏洞
        3.2 开发注意事项
            https,POST数据
            验证码和新密码必须在同一次请求里发送,不允许分开
        3.3 重置逻辑
            a. 判断条件
                登陆判断
                手机号是否是用户绑定的手机号
                短信验证码是否正确
                密码是否合法
            b. 处理逻辑
                生成password_hash
                记录修改记录
                更新用户password_hash
        ps:如果是邮箱形式的密码修改,注意事项
            发送token
            token不能有任何的用户信息
            token必须有失效条件
                发送了新的,旧的就必须失效
                有效期
                使用过之后就失效            
                不要通过email发送用户的新密码

五、知识拓展,了解即可
    1、散列hash
        1.1 内容摘要算法
        1.2 加密和hash的区别
        1.3 hash碰撞
            hash长度固定,而且集合比内容集合小,所以存在内容不一样,hash值一样的情况
        1.4 hash函数和加密hash函数的区别
        1.5 慢速hash函数
        1.6 盐值
    2、hash破解办法
        反向查表
        彩虹表
        暴力破解
    3、撞库攻击
    4、安全分类
        浏览器安全
            xss攻击
            csrf
            点击劫持
            H5
        应用服务器安全
            sql注入
            文件上传
            会话劫持
            访问控制
            web框架安全
            DDOS攻击
            PHP语言安全
            webSERVER 配置安全
        运维安全
            服务器入侵
            防火墙
            开源产品安全设置
                redis、memcache、mongodb等等

六、参考文档
    OWASP
        https://www.owasp.org/index.php/Main_Page
    Salted Password Hashing - Doing it Right
        https://crackstation.net/hashing-security.htm
    如何安全的存储用户的密码
        http://www.freebuf.com/articles/web/28527.html
    更新后的 PHP: 现代 PHP 中的密码安全性
        http://www.ibm.com/developerworks/cn/web/wa-php-renewed_2/
    浅谈密码存储安全
        https://my.oschina.net/hjh188/blog/491666
    用户密码加密存储十问十答,一文说透密码安全存储
        http://www.cnblogs.com/xinzhao/p/6035847.html   
    Dropbox是如何安全地存储用户密码的
        http://www.infoq.com/cn/news/2016/12/How-Dropbox-securely-passwords
    Portable PHP password hashing framework
        http://www.openwall.com/phpass/
    hash_values
        http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx#hash_values
    How do you use bcrypt for hashing passwords in PHP?
        http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php
    PHP处理密码的几种方式
        https://segmentfault.com/a/1190000003024932
    密码散列安全
        http://php.net/manual/zh/faq.passwords.php

发表评论