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

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存储过程示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背包问题 贪心算法 java_JS基于贪心算法解决背包问题

前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题。贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某…

Nginx配置proxy_pass

nginx配置proxy_pass,需要注意转发的路径配置 1、location /test/ { proxy_pass http://t6:8300; } 2、location /test/ { proxy_pass http://t6:8300/; } 上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/” 针对情况1 如果访问url ht…

java代码耗尽内存_有关Java内存溢出及内存消耗的小知识

内存溢出原理:我们知道,Java程序本身是不能直接在计算机上运行的,它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机)。Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度上会影响应用程…

简单一致的Log4j2 Logger命名

在带有Java 7方法句柄的可移植记录器名称一文中 ,我写了关于使用Java 7的方法句柄来命名类的记录器的文章。 我在那篇文章中说过,这种方法的优点包括记录器命名的一致性,避免了意外的代码复制和粘贴,这可能会导致将不同的类名用作…

第三周总结 类、对象、包

1.面向对象的特征有哪些?封装、继承、多态、(抽象)2.一个“.java”文件中是否可以有多个类(不是内部类)?有什么限制吗?可以有多个类,但是public的类只有一个,而且必须和j…

java服务器崩溃的原因_请求大神帮忙分析一下服务器崩溃原因

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼---- Minecraft Crash Report ----// Who set us up the TNT?Time: 14-6-11 上午12:52Description: Exception in server tick loopjava.lang.NoClassDefFoundError: scala/collection/Seqat java.lang.Class.forName0(Native Met…

VBA_Excel_教程:过程,函数

Sub s1()Debug.Print "s1"调用过程:无括号,加call提升可读性s2Call s2 End SubSub s2()Debug.Print "s2" End Sub 函数当过程用完全没有问题 Function f1()Debug.Print "f1"f2Call f2 End FunctionFunction f2()Debug.Pri…

java同步方法的特点_java多线程有哪些优点?同步实例代码展示

在我们的日常学习当中会发现java的知识点是总是息息相关的,可以串联起来。java中多线程的有关内容可以衍生出更多知识,它的优缺点也是非常明显的。你都了解吗?一起来看看吧。首先为大家介绍一下,多线程(多个线程同时运行)程序的优缺点优点&a…

使用JUnit规则进行干净的集成测试

JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这些简化了灯具控制。 作为示例,我们将看看如何基于…

FreeRTOS--API函数

FreeRTOS--API函数转载于:https://www.cnblogs.com/LittleTiger/p/6128708.html

java fx 内置图标_图标 – 如何在Windows上为javafx本机程序包图标设置自定义图标...

我正在尝试创建exe文件的图标,同时创建javafx包装的本机捆绑.我尝试将图标添加到pom.xml中,但直到它不会为我工作,因为它提供了默认图标使用包含Pom.xml的Intellij IDEA IDE,通过command mvn jfx:build-native创建包这是我的pom.xml:com.zenjavajavafx-…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要互联网的支持,代码部分在用户电脑上执行 使用…

java排序两个数组_java – 如何相对于彼此排序两个数组.

由于这两个值紧密耦合在一起,我实际上会编写一个自定义类来包含信息,然后对这些类进行排序,而不是使用原始数组.这样做会让你对许多可能的错误开放.这样可以更好地控制,数据封装以及将来可能包含哪些方法或数据的扩展.public class MyDistance implements Comparable {private …

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

java 枚举内嵌枚举_Java枚举益智游戏

java 枚举内嵌枚举假设我们有以下代码&#xff1a; enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;private int valueDependsOnCounter;static {int sum 0;for(int i 0; i<10; i) {sum i;}counter sum;} Case() {this.valueDependsOnCounte…

Java注释 link_Java 文档注释

Java只是三种注释方式。前两种分别是// 和/* */&#xff0c;第三种被称作说明注释&#xff0c;它以/** 开始&#xff0c;以 */结束。说明注释允许你在程序中嵌入关于程序的信息。你可以使用javadoc工具软件来生成信息&#xff0c;并输出到HTML文件中。说明注释&#xff0c;是你…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

约瑟夫问题(java实现)

方法一、自定义的链表实现package com.code.yuesefu;public class YueSeFuList {public static void main(String[] args) {int count 41;//申请一个指定长度的链表Node n YueSeFuList.createNodes(count);for(int i0;i<count;i){Node second n.next;//第2个n n.next.ne…

java多线程流式写入文件夹_java多线程写入同一文件

1.[代码][Java]代码package com.thread;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.concurrent.ConcurrentLinkedQueue;/*** 多线程下写文件* author owen.huang**//*** 将要写入…

Duilib嵌入CEF以及JavaScript与C++交互

转载:http://blog.csdn.net/foruok/article/details/50573612 转载:http://blog.csdn.net/foruok/article/details/50584985 转载:http://blog.csdn.net/mfcing/article/details/44539035 转载:https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_JavaScript_Cpp.md 转…