java存储过程示例

安全存储密码的重要性
作为软件开发人员,我们最重要的职责之一就是保护用户的个人信息。 如果没有我们应用程序的技术知识,用户别无选择,只能相信我们正在履行这一责任。 令人遗憾的是,在密码方面,软件开发社区的记录不一。
尽管不可能构建一个100%安全的系统,但幸运的是,我们可以采取一些简单的步骤来使用户的密码足够安全,以使潜在的黑客能够寻找更容易的猎物。
如果您不希望所有背景知识,请随时跳到下面的Java SE示例 。
不要
首先,让我们快速讨论一些在构建需要身份验证的应用程序时不应该做的事情:
  • 除非确实需要,否则不要存储身份验证数据。 这似乎是一个解决方案,但是在开始构建用户凭据数据库之前,请考虑让其他人来处理它。 如果您要构建公共应用程序,请考虑使用OAuth提供程序,例如Google或Facebook 。 如果要构建内部企业应用程序,请考虑使用任何可能已经存在的内部身份验证服务,例如公司LDAP或Kerberos服务。 无论是公共应用程序还是内部应用程序,您的用户都将无需记住其他用户ID和密码,这将是不胜枚举的选择,而且数据库供黑客攻击的少得多。
  • 如果您必须存储身份验证数据,那么就Gosling而言,请不要以明文形式存储密码 。 这应该很明显,但是值得一提。 让我们至少让黑客大汗淋漓。
  • 除非您确实需要检索明文密码,否则不要使用双向加密。 仅当您使用他们的凭据代表他们与外部系统交互时,才需要知道他们的明文密码。 即使这样,您最好还是让用户直接通过该系统进行身份验证。 为了清楚起见, 您无需使用用户的原始明文密码在应用程序中执行身份验证 。 稍后我将对此进行更详细的介绍,但是在执行身份验证时,您将对用户输入的密码应用加密算法,并将其与您存储的加密密码进行比较。
  • 不要使用像MD5这样的过时的哈希算法 。 老实说,用MD5散列密码实际上是没有用的。 这是MD5哈希密码: 569a70c2ccd0ac41c9d1637afe8cd932 。 转到http://www.md5hacker.com/ ,您可以在几秒钟内将其解密。
  • 不要提出自己的加密方案。 世界上有一些杰出的加密专家,能够胜过黑客并设计出新的加密算法。 我不是其中之一,很可能您也不是。 如果黑客可以访问您的用户数据库,那么他们也可能也可以获取您的代码。 除非您发明了PBKDF2或bcrypt的下一个伟大的后继产品,否则它们将疯狂地破解,因为它们会Swift破解所有用户的密码并将其发布在Darknet上 。
Dos
好的,对不应该做的事情进行充分的讲授。 这是您需要重点关注的事项:
  • 选择一种单向加密算法。 如前所述,一旦您加密并存储了用户密码,就无需再知道真实的价值了。 用户尝试进行身份验证时,只需将相同的算法应用于他们输入的密码,然后将其与您存储的加密密码进行比较。
  • 使加密速度尽可能慢,以使应用程序可以容忍 。 任何现代的密码加密算法都应允许您提供增加密码加密所需时间的参数(即,在PBKDF2中,指定迭代次数)。 为什么慢的好? 您的用户不会注意到是否需要花费额外的100毫秒来加密密码,但是尝试进行暴力攻击的黑客会在数十亿次运行该算法时注意到这种差异。
  • 选择一个众所周知的算法 。 美国国家标准技术研究院(NIST) 建议使用PBKDF2作为密码。 bcrypt是一种流行且已建立的替代方法,而scrypt是一种相对较新的算法,已广受欢迎。 所有这些都是受欢迎的原因:它们很好。
PBKDF2
在向您展示一些具体代码之前,让我们先谈谈为什么PBKDF2是加密密码的理想选择:
  • 由NIST推荐。 特殊出版物800-132的 5.3节建议使用PBKDF2加密密码。 安全官员会喜欢的。
  • 可调式按键伸展功能可以克服蛮力攻击 。 密钥扩展的基本思想是,在将哈希算法应用于密码之后,您将继续对结果多次应用同一算法(迭代计数)。 如果黑客试图破解您的密码,那么这将大大增加尝试数十亿种可能的密码所需的时间。 如前所述,速度越慢越好。 PBKDF2允许您指定要应用的迭代次数,从而使其尽可能慢。
  • 一种必需的盐,可用来克服彩虹表攻击并防止与其他用户的冲突。 盐是每个用户唯一的随机生成的位序列,并作为哈希的一部分添加到用户密码中。 通过使结果的预先计算的列表不可行,可以防止彩虹表攻击 。 而且,由于每个用户都有自己的名字,即使两个用户使用相同的密码,加密值也将不同。 关于是否应将盐与加密密码分开存放的地方,存在许多相互矛盾的信息。 由于PBKDF2中的密钥扩展已经保护了我们免受暴力攻击,因此我认为没有必要隐藏盐。 NIST SP 800-132的3.1节还将盐定义为“非秘密的二进制值”,这就是我所要遵循的。
  • Java SE 6的一部分 。 无需其他库。 这对于在具有限制性开放源代码策略的环境中工作的人员特别有吸引力。
最后是一个具体的例子
好的,这是一些使用PBKDF2加密密码的代码。 仅需要Java SE 6。
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;public class PasswordEncryptionService {public boolean authenticate(String attemptedPassword, byte[] encryptedPassword, byte[] salt)throws NoSuchAlgorithmException, InvalidKeySpecException {// Encrypt the clear-text password using the same salt that was used to// encrypt the original passwordbyte[] encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);// Authentication succeeds if encrypted password that the user entered// is equal to the stored hashreturn Arrays.equals(encryptedPassword, encryptedAttemptedPassword);}public byte[] getEncryptedPassword(String password, byte[] salt)throws NoSuchAlgorithmException, InvalidKeySpecException {// PBKDF2 with SHA-1 as the hashing algorithm. Note that the NIST// specifically names SHA-1 as an acceptable hashing algorithm for PBKDF2String algorithm = "PBKDF2WithHmacSHA1";// SHA-1 generates 160 bit hashes, so that's what makes sense hereint derivedKeyLength = 160;// Pick an iteration count that works for you. The NIST recommends at// least 1,000 iterations:// http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf// iOS 4.x reportedly uses 10,000:// http://blog.crackpassword.com/2010/09/smartphone-forensics-cracking-blackberry-backup-passwords/int iterations = 20000;KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, derivedKeyLength);SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);return f.generateSecret(spec).getEncoded();}public byte[] generateSalt() throws NoSuchAlgorithmException {// VERY important to use SecureRandom instead of just RandomSecureRandom random = SecureRandom.getInstance("SHA1PRNG");// Generate a 8 byte (64 bit) salt as recommended by RSA PKCS5byte[] salt = new byte[8];random.nextBytes(salt);return salt;}
}

流程如下所示:
  1. 添加新用户时,请调用generateSalt() ,然后调用getEncryptedPassword() ,并存储加密的密码和盐。 不要存储明文密码。 不必担心将盐与加密的密码保存在单独的表或位置中; 如上所述,该盐是非秘密的。
  2. 对用户进行身份验证时,请从数据库中检索以前加密的密码和盐,然后将它们和他们输入的明文密码发送到authenticate() 。 如果返回true,则认证成功。
  3. 当用户更改密码时,可以安全地重用其旧版本; 您可以只用旧的盐调用getEncryptedPassword()
很容易,对吧? 如果您要构建或维护的应用程序违反了上述“禁止”之列, 帮您的用户一个忙,并使用PBKDF2或bcrypt之类的东西。 帮助他们,Obi-Wan开发人员,您是他们唯一的希望。
参考: 安全密码存储– Java博客上的Jerry,我们的JCG合作伙伴 Jerry Orr提供了许多不要做的事情,一些需要做的事情以及一个具体的Java SE示例 。

翻译自: https://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html

java存储过程示例

java存储过程示例_安全密码存储–请勿做的事和Java示例相关推荐

  1. 安全密码存储–请勿做的事和Java示例

    安全存储密码的重要性 作为软件开发人员,我们最重要的职责之一就是保护用户的个人信息. 没有我们应用程序的技术知识,用户别无选择,只能相信我们正在履行这一责任. 令人遗憾的是,在密码方面,软件开发社区的 ...

  2. java 通配符 类_关于类:具有多个类的Java泛型通配符

    我想要一个类对象,但是我想要强制它所代表的任何类来扩展类A和实现接口B. 我能做到: Class extends ClassA> 或: Class extends InterfaceB> ...

  3. java syn包_月薪3K的后端面试点-网络与Java

    网络基础 传输控制协议TCP简介 面向连接的.可靠的.基于字节流的传输层通信协议 将应用层的数据流分割成报文段并发送给目标节点的TCP层 数据包都有序号,对方收到则发送ACK确认,未收到则重传 使用校 ...

  4. opencv3 java开发手册_介绍一本opencv不错的书-OpenCV3使用Java开发手册

    你们好 http://www.topteam.cc/02-shop-detail.php?cid=&sid=&pid=896 Opencv 不但有趣并且是免费的视觉相关开发软体,它可以 ...

  5. mysql存储登录密码_当密码存储在选项文件中时,MySQL拒绝登录尝试

    第一: >我们正在运行MySQL 5.7.13. >操作系统是Red Hat Enterprise Linux 7.2. >首先使用Python / Connector 2.1.3发 ...

  6. java rtmp推流_视频直播生成推流和播放地址的Java代码示例

    概述 直播推流地址和播放地址本身没有API接口,需要在客户端自行拼接地址,然后使用推流工具或者播放器对其推流或播放.本文主要介绍如何生成直播的推流以及播放地址. 详细信息 视频直播生成推流和播放地址的 ...

  7. 使用示例_使用 COMSOL 软件模拟不规则形状并构建几何模型示例

    本文是如何在 COMSOL Multiphysics® 软件中模拟不规则形状的系列文章的第二部分.今天我们重点介绍如何基于以各种格式存储的高程数据(例如文本.图像或 DEM 文件)创建不规则形状的表面 ...

  8. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  9. java对象头_我的并发编程(二):java对象头以及synchronized升级过程

    一.概述 研究java对象头的目的是详细分析Java的synchronized锁的升级过程,因为synchronized在锁升级的时候,就是依赖对象头的信息来决定的.本博文针对64位的操作系统来对Ja ...

最新文章

  1. JS正则表达式使用方法及示例
  2. python 查看网络模型
  3. 开源许可证的变更带给我们什么启示?
  4. VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题
  5. Leetcode--91. 解码方法
  6. larvel php restful_laravel 实现一个简单的 RESTful API
  7. linux 检测蓝牙 rssi,蓝牙LE信号强度Linux
  8. java界面字体大小设置_怎样更改电脑界面的字体大小?
  9. 用DOS写一个简单的虚拟WIFI工具,CMD电脑无线WIFI工具,BAT实现WIFI和自动关机
  10. 男孩子不上学了学计算机要学历吗,十三岁男孩不上学,能学什么手艺?
  11. python编写程序输出诗句_python基于词向量的古诗生成器
  12. java 适配器模式详解_JAVA设计模式详解(五)----------适配器模式
  13. java字母排序_Java实现按照大小写字母顺序排序的方法
  14. oracle sysdate毫秒,oracle systimestamp(sysdate)到毫秒
  15. 怎样挑选鱼头 鱼头怎么做好吃
  16. CSS设置元素内边距(padding)、外边距(margin)
  17. ios 按钮下面加下划线_如何在iOS按钮上的文字添加下划线
  18. VOCBENCH声码器评价基准
  19. 调试OTM4001A液晶驱动的一点心得
  20. 网站绑定域名后不能用IP直接访问了?

热门文章

  1. Java 常见的 30 个误区与细节
  2. publiccms按照指定显示的日期格式,格式化日期的写法
  3. 开学一月,可以自己玩自己做的游戏了!!!
  4. 使用java读取文件并输出
  5. SpringMVC中使用作用域对象完成数据的流转
  6. JS生成x到y的随机数
  7. java 单一职责原则_设计模式之单一职责原则
  8. 猜数字游戏 : 共给玩家10次机会,若第一次就猜对了,显示‘您真是个天才’,若10也没猜对,显示“您太笨了,下次努力吧!”, 若是第2-10次猜对了,只简单的显示:“恭喜您猜对了”。
  9. idea2021部署maven+javaweb项目到jboss(diy)
  10. thinking-in-java(21)并发2