精华内容
下载资源
问答
  • 首先,您需要下载附件的类模块(clsMD5.txt)并将其导入数据库。 这个类模块是我们要讲的内容的核心。 感谢Robert Hubley编写它-您是我的英雄! 接下来,您的数据库需要一个users表。 我们以这个为例。 tblUsers ...

    我已经看到了很多有关如何创建安全数据库密码的问题。 我将介绍一种使用MD5加密算法对密码进行加密的方法,以实现最大的安全性。

    首先,您需要下载附件的类模块(clsMD5.txt)并将其导入数据库。 这个类模块是我们要讲的内容的核心。 感谢Robert Hubley编写它-您是我的英雄!

    接下来,您的数据库需要一个users表。 我们以这个为例。

    
    tblUsers 
    Field           Type
    UserID          AutoNum  PK
    strLastName     Text
    strFirstName    Text
    strMI           Text
    strUserName     Text    (no duplicates)
    strPassword     Text    (encrypted)
    strPermissions  Text    (access permissions)     
    现在,您将需要某种类型的“编辑用户选项”表单供用户创建密码。建立表单,并为密码添加一个UNBOUND文本框控件。 我们将其称为txtTempPassword。 确保将“输入掩码”设置为“密码”,以便没有人可以监视密码。

    因此,我们有以下内容:

    
    Object      Name             Bound To 
    Form        frmUserOptions   tblUsers
    Text Box    txtTempPassword  Unbound     
    现在,在txtTempPassword的AfterUpdate事件上,使用以下代码:
    
    strPassword = DigestStrToHexStr(Me.txtTempPassword) 
    DigestStrToHexStr()函数可以将您的纯文本密码转换为安全的MD5加密的十六进制乱码。

    现在,当用户尝试登录到您的自定义登录表单时您会怎么做?

    您的登录表单可能会遵循以下基本结构:

    
    Object      Name             Bound To
    --------------------------------------------------- 
    Form        frmLogin         Unbound 
    Text Box    txtUsername      Unbound
    Text Box    txtPassword      Unbound
    Button      cmdLogin 
    在按钮的OnClick事件中,您将具有用于对照表检查输入的用户名和密码的文本的代码,以查看是否存在匹配项。 显然,现在密码已加密,不会。 解决方案是使用相同的DigestStrToHexStr()函数对搜索字符串进行加密。 考虑以下:
    
    Private Sub cmdLogin_Click()
    Dim rs As DAO.Recordset
        Set rs = CurrentDb.OpenRecordset("SELECT UserID, strUsername, strPassword FROM tblUsers", dbOpenSnapshot)
        'first, see if the username is valid
        rs.FindFirst "strUsername = '" & Me.txtUsername & "'"
        If rs.NoMatch Then GoTo ErrorOut
        'next, check the password
        If rs!strPassword = DigestStrToHexStr(Me.txtPassword) Then
            DoCmd.Close
            'open switchboard and run any other code
        End If
        Exit Sub
        'close the app if the login was incorrect
    ErrorOut:
        MsgBox "Username/password combination is invalid." & _
        vbCrLf & vbCrLf & "Exiting application.", vbCritical
        Application.Quit
    End Sub
    显然,您将需要个性化此代码以供使用,但这就是这个主意。 使用安全的MD5加密密码制作数据库,玩得开心!
    附加的文件
    档案类型:txt clsMD5.txt (18.1 KB,2261视图)

    From: https://bytes.com/topic/access/insights/877896-generate-secure-user-passwords-using-md5-hash-class-module

    展开全文
  • 获取系统密码哈希值的软件很多,在本小节中主要介绍如何通过saminside来获取系统的hash以及结合彩虹表快速破解操作系统用户密码。下载和使用saminsideSaminside的官方下载地址为:http://www...

    83c6789ad80a86947af14bf7e561d92c.png

    在通过SQL注入等方式获取网站的Webshell后,就需要利用系统各种漏洞进行提权,提权成功后通过远程终端登入系统,此时为了长期控制或者进一步渗透网络,就需要获取系统正常用户的密码。获取系统密码哈希值的软件很多,在本小节中主要介绍如何通过saminside来获取系统的hash以及结合彩虹表快速破解操作系统用户密码。

    下载和使用saminside

    Saminside的官方下载地址为:http://www.insidepro.com/download/saminside.zip,目前最新版本为2.6.5,官方提供的是试用版本,有一些高级功能不能使用,但并不影响获取系统密码哈希值,saminside可以获取包括Windows 2008 Server以下操作系统的用户密码哈希值,在获取这些哈希值后可以通过彩虹表或者字典等来进行破解,进而获取系统的密码。Saminside不需要安装,将下载的saminside.zip解压缩到本地磁盘即可使用。

    使用Scheduler导入本地用户的哈希值

    直接运行saminside,如图1 所示,单击第三个小图标,然后选择“Import Local Users via Scheduler”,将本地用户的Hash导出。虽然在saminside中还提供了从LSASS导出本地用户,但该方法在一些操作系统中容易出错,这两个方法均可使用。

    04a2f1ff1d830ca678c7cdcb0174788c.png

    图1 使用Scheduler导入本地用户的哈希值

    查看导入到Hash值

    使用saminside导入本地用户的哈希值,必须具有管理员权限,在有些情况下,管理员会对磁盘进行权限限制,这个时候需要为saminside授权,然后才能获取系统用户的hash值,如图2 所示,一共获取了4个用户的hash值,该值按照User、RID、LM-Password、NT-Password、LM-Hash、NT-Hash和Description顺序进行显示。如果在LM-Password和NT-Password显示为Disabled,则表示该账户是禁用帐号。超过14位的密码,在LM-Password中会以全0显示,在老版本中以AA3D开头显示的也表示密码位数超过14位,例如“simeon:1005:AAD3B435B51404EEAAD3B435B51404EE:5E9C2FAAE669F5D06F33014E33AC2CFC:::”其密码就是超过14位。

    ac5c2e1d76ee4cda223fc450241f76f1.png

    图2 查看导入到Hash值

    导出系统用户的hash值

    单击“File”-“Export Users to PWDUMP File”将获取系统用户的密码哈希值导出为一个文件,其导出文件的内容如图3 所示,然后将该文件再次导入到ophcrack中进行破解。Saminside本身也能破解系统hash值,不过破解速度和效果不如ophcrack,一些简单的密码Saminside直接显示其密码,使用感兴趣的朋友可以直接去尝试使用Saminside破解系统hash值。

    0c54e34a4769ff7361fa045239e79f04.png

    图3 导出系统用户的hash值

    设置saminside破解方式

    如图4 所示,默认选择LM-hashes attack破解方式,如果用户密码超过14位,或者LM-hash中显示的全是0,则可以选择NT-hashes attack进行破解。然后还需要选择字典破解、暴力破解、掩码破解以及彩虹表破解。

    cd0803dc01d64fb07697466f7fa4d38d.png

    图4 设置saminside破解方式

    如果是选择采用字典破解,则需要在设置中选择“options”,在“Dictionary attack”中设置字典,将本地字典文件添加到字典文件列表中,如图5 所示。可以设置多个字典文件进行破解。Saminside帮助中提供了在线字典下载,大概有2G字典可供下载。

    d24f44a4f214e213b61872b3f2898279.png

    图5 导入字典文件进行破解

    执行破解

    设置好破解有关选项后,单击其绿色小三角形图标进行破解,如图6 所示,如果密码在字典文件中,则很快就会给出结果。

    66fc5b326b12a39be23ecfb569532c37.png

    图6 运行字典破解本地用户密码

    使用ophcrack破解操作系统用户密码值

    另外一种快捷的破解用户密码的方式就是将导出的文件导入到到ophcrack进行破解,运行ophcrack,单击“Load”-“PWDUMP file”选择前面使用saminside导出的文件,接着单击“Crack”按钮进行破解,如图7 所示,一共花了2分7秒钟便将该系统的密码成功破解出来。有关ophcrack的详细使用方法请参考本书后面的利用ophcrack破解系统密码的章节。

    c40a4e18892fae1713ca4142512a88d9.png

    图7 使用ophcrack破解操作系统用户密码值

    作者介绍:陈小兵,北京理工大学博士,计算机网络安全攻防专家,原海军某部网络安全研究员、公安部网络安全攻防实验员、曾就职于北京公安局网络安全总队,主要从事网络安全攻防研究工作,在网络安全研究与培训、病毒防范、网络渗透等领域具有20年以上经验,在业内享有盛名。曾出版多本业内权威性著作包括《SQL Server2000培训教程》《黑客攻防及实战案例解析》《Web渗透及实战案例解析》《安全之路-Web渗透及实战案例解析第二版》、《黑客攻防实战加密与解密》,在国内核心期刊及普通学术期刊发表论文20余篇。

    展开全文
  • 本文以java为例,进行实际加解密操作: ... 使用salt+password进行哈希算法加密!哈希算法选择:PBKDF2! 1.1生成salt 使用随机函数java.security....本文参考的依据是:JDK API 1.6.0 中文版,下载地址:http:/...

    本文以java为例,进行实际加解密操作:

    1       密码加盐hash

    使用salt+password进行哈希算法加密!哈希算法选择:PBKDF2!

    1.1    生成salt

    使用随机函数java.security.SecureRandom生成24位随机数作为salt:

    本文参考的依据是:JDK API 1.6.0 中文版,下载地址:http://down.51cto.com/data/2300228

     

    1.2    PBKDF2代码详解

    可以直接copy到代码中

    package com.demo.encrypt;

     

    /*

     *Password Hashing With PBKDF2 (http://crackstation.net/hashing-security.htm).

     *Copyright (c) 2013, Taylor Hornby

     *All rights reserved.

     *

     *Redistribution and use in source and binary forms, with or without

     *modification, are permitted provided that the following conditions are met:

     *

     * 1.Redistributions of source code must retain the above copyright notice,

     *this list of conditions and the following disclaimer.

     *

     * 2.Redistributions in binary form must reproduce the above copyright notice,

     *this list of conditions and the following disclaimer in the documentation

     *and/or other materials provided with the distribution.

     *

     *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "ASIS"

     *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

     *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

     *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE

     *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

     *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

     *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

     *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

     *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

     *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE

     *POSSIBILITY OF SUCH DAMAGE.

     */

     

    import java.math.BigInteger;

    importjava.security.NoSuchAlgorithmException;

    import java.security.SecureRandom;

    import java.security.spec.InvalidKeySpecException;

     

    import javax.crypto.SecretKeyFactory;

    import javax.crypto.spec.PBEKeySpec;

     

    /*

     *PBKDF2 salted password hashing.

     *Author: havoc AT defuse.ca

     *www: http://crackstation.net/hashing-security.htm

     */

    public class HashEncrypt {

             //PBKDF2.PBKDF2WithHmacSHA1, PBKDF2.PBKDF2WithHmacSHA224,PBKDF2.PBKDF2WithHmacSHA256,

             //PBKDF2.PBKDF2WithHmacSHA384,//PBKDF2.PBKDF2WithHmacSHA512

             //pbkdf2算法API链接:http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/pkcs/pkcs5/PBKDF2.html

             publicstatic final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

             //publicstatic final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA256";

             //注意jdk1.8以下版本不支持SHA224以及SHA224以上算法,会报错:(项目环境为JDK1.7)

             //ERROR:java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA224 SecretKeyFactorynot available

             //The following constants may be changed without breaking existing hashes.

             publicstatic final int SALT_BYTE_SIZE = 16;//=32/2,生成字符长度为32的salt值

             publicstatic final int HASH_BYTE_SIZE = 24;

             publicstatic final int PBKDF2_ITERATIONS = 1000;

     

             publicstatic final int ITERATION_INDEX = 0;

             publicstatic final int SALT_INDEX = 1;

             publicstatic final int PBKDF2_INDEX = 2;

     

             /**

              * Returns a salted PBKDF2 hash of thepassword.(返回使用PBKDF2对password进行加盐hash生成的字符串)

              *

              * @param  password    the password to hash

              * @return              a salted PBKDF2 hash of thepassword

              */

             publicstatic String createHash(String password)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       returncreateHash(password.toCharArray());

             }

     

             /**

              * Returns a salted PBKDF2 hash of thepassword.(返回使用PBKDF2对password字节数组进行加盐hash生成的字符串)

              *

              * @param  password    the password to hash

              * @return              a salted PBKDF2 hash of thepassword

              */

             publicstatic String createHash(char[] password)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       LongstartTime = System.currentTimeMillis();

                       //Generate a random salt:创建一个随机16位盐

                       SecureRandomrandom = new SecureRandom();

                       byte[]salt = new byte[SALT_BYTE_SIZE];

                       random.nextBytes(salt);

                       //Hash the password :生成可以编码的密钥

                       byte[]hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);

                       LongendTime = System.currentTimeMillis();

                       System.out.println("生成加盐hash密码时间是:"+ String.valueOf(endTime - startTime));

                       //format iterations:salt:hash:对字节数组进行hash返回字符串,字符串结构:(迭代次数:salt盐:加盐hash密码)

                       returnPBKDF2_ITERATIONS + ":" + toHex(salt) + ":" + toHex(hash);

             }

     

             /**

              * Validates a password using a hash.(校验密码是否正确)

              *

              * @param  password        the password tocheck

              * @param  correctHash     the hash of thevalid password

              * @return                  true if the password iscorrect, false if not

              */

             publicstatic boolean validatePassword(String password, String correctHash)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       returnvalidatePassword(password.toCharArray(), correctHash);

             }

     

             /**

              * Validates a password using a hash.(校验密码是否正确实现)

              *

              * @param  password        the password tocheck

              * @param  correctHash     the hash of thevalid password

              * @return                  true if the password iscorrect, false if not:校验密码是否正确

              */

             publicstatic boolean validatePassword(char[] password, String correctHash)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       //correctHash字符串的结构为(迭代次数:salt盐:加盐hash密码)

                       //Decode the hash into its parameters:冒号分隔correctHash

                       String[]params = correctHash.split(":");

                       //params[0]:迭代次数

                       intiterations = Integer.parseInt(params[ITERATION_INDEX]);

                       //params[1]:salt盐 ,再转换为字节数组

                       byte[]salt = fromHex(params[SALT_INDEX]);

                       params[2]:加盐hash密码字符串,再转换为字节数组

                       byte[]hash = fromHex(params[PBKDF2_INDEX]);

                       //Compute the hash of the provided password, using the same salt,

                       //iteration count, and hash length :使用password生成密钥

                       byte[]testHash = pbkdf2(password, salt, iterations, hash.length);

                       //Compare the hashes in constant time. The password is correct if

                       //both hashes match.:比较密钥是否相等

                       returnslowEquals(hash, testHash);

             }

     

             /**

              * Compares two byte arrays in length-constanttime. This comparison method

              * is used so that password hashes cannot beextracted from an on-line

              * system using a timing attack and thenattacked off-line.

              * 这段代码使用了异或(XOR)操作符”^”来比较整数是否相等,而没有使用”==”操作符。原因在于如果两个数完全一致,异或之后的值为零。

              * 
    因为 0 XOR 0 = 0, 1 XOR1 = 0, 0 XOR 1 = 1, 1 XOR 0 = 1。

              * 
    所以,第一行代码如果a.length等于b.length,变量diff等于0,否则的话diff就是一个非零的值。

              * 
    然后,让a,b的每一个字节XOR之后再跟diff OR。这样,只有diff一开始是0,并且,a,b的每一个字节XOR的结果也是零,

              * 
    最后循环完成后diff的值才是0,这种情况是a,b完全一样。否则最后diff是一个非零的值。

              *

              * @param  a       the first byte array

              * @param  b       the second byte array

              * @return          true if both byte arrays are thesame, false if not:比较两个字节数组是否相等。0相等;1不等

              */

             privatestatic boolean slowEquals(byte[] a, byte[] b) {

                       intdiff = a.length ^ b.length;

                       for(int i = 0; i < a.length && i < b.length; i++)

                                diff|= a[i] ^ b[i];

                       returndiff == 0;

             }

     

             /**

              * Computes the PBKDF2 hash of a password.(使用pbkdf2算法生成加盐hash字节数组)

              *

              * @param  password    the password to hash.

              * @param  salt        the salt

              * @param  iterations  the iteration count(slowness factor)

              * @param  bytes       the length of the hashto compute in bytes

              * @return              the PBDKF2 hash of the password:使用pbkdf2进行加盐hash生成密钥

              */

             privatestatic byte[] pbkdf2(char[] password, byte[] salt, int iterations,

                                intbytes) throws NoSuchAlgorithmException, InvalidKeySpecException {

                       //PBEKeySpec:可随同基于密码的加密法 (PBE)

                       //使用的供用户选择的密码。可以将密码视为某种原始密钥内容,由此加密机制使用其导出一个密钥。

                       //带有生成可变密钥大小的 PBE 密码的 PBEKey 时使用的一个密码、salt、迭代计数以及导出密钥长度的构造方法。如果指定

                       //password 为 null,则使用一个空 char[]。

                       //注:在将 password 和 salt 存储进新的 PBEKeySpec 对象前将其复制。

                       //参数:

                       //password - 密码。

                       //salt - salt。

                       //iterationCount - 迭代计数。

                       //keyLength - 要导出的密钥长度。

                       PBEKeySpecspec = new PBEKeySpec(password, salt, iterations, bytes * 8);

                       //SecretKeyFactory此类表示秘密密钥的工厂。

                       //getInstance(String PBKDF2_ALGORITHM)返回转换指定算法的秘密密钥的SecretKeyFactory

                       //对象。

                       //PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

                       SecretKeyFactoryskf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);

                       //skf.generateSecret(spec)根据提供的密钥规范(密钥材料)生成 SecretKey 对象。

                       //SecretKey.getEncoded()返回基本编码格式的密钥,如果此密钥不支持编码,则返回 null。

                       returnskf.generateSecret(spec).getEncoded();

             }

     

             /**

              * Converts a string of hexadecimal charactersinto a byte array.(将十六进制字符串转换为字节数组)

              *

              * @param  hex         the hex string

              * @return              the hex string decoded into abyte array:字符串转换为字节数组

              */

             privatestatic byte[] fromHex(String hex) {

                       byte[]binary = new byte[hex.length() / 2];

                       for(int i = 0; i < binary.length; i++) {

                                binary[i]= (byte) Integer.parseInt(

                                                   hex.substring(2* i, 2 * i + 2), 16);

                       }

                       returnbinary;

             }

     

             /**

              * Converts a byte array into a hexadecimalstring.(将字节数组转换为十六进制字符串)

              *

              * @param  array       the byte array toconvert

              * @return              a length*2 character stringencoding the byte array::字节数组转换为字符串

              */

             privatestatic String toHex(byte[] array) {

                       BigIntegerbi = new BigInteger(1, array);

                       Stringhex = bi.toString(16);

                       intpaddingLength = (array.length * 2) - hex.length();

                       if(paddingLength > 0)

                                returnString.format("%0" + paddingLength + "d", 0) + hex;

                       else

                                returnhex;

             }

     

             /**

              * Tests the basic functionality of thePasswordHash class

              *

              * @param  args        ignored

              */

             publicstatic void main(String[] args) {

                       try{

                                //Print out 10 hashes

                                for(int i = 0; i < 10; i++) {

                                         //System.out.println(HashEncrypt.createHash("p\\r\\nassw0Rd!"));

                                         System.out.println("生成加盐hash后密钥:第" +i + "次:hashPWd:"

                                                            +HashEncrypt.createHash("p\\r\\nassw0Rd!"));

                                }

     

                                //Test password validation

                                booleanfailure = false;

                                System.out.println("Runningtests...");

                                for(int i = 0; i < 2; i++) {

                                         Stringpassword = "" + i;

                                         Stringhash = createHash(password);

                                         System.out.println("password第一次加盐hash:"+ hash);

                                         StringsecondHash = createHash(password);

                                         System.out.println("password第二次加盐hash:"+ secondHash);

                                         if(hash.equals(secondHash)) {

                                                   //System.out.println("FAILURE: TWO HASHES ARE EQUAL!");

                                                   System.out.println("password="+ i

                                                                     +",加盐hash后生成的两个密钥相等!就不可用!");

                                                   failure= true;

                                         }

                                         StringwrongPassword = "" + (i + 1);

                                         if(validatePassword(wrongPassword, hash)) {

                                                   //System.out.println("FAILURE: WRONG PASSWORD ACCEPTED!");

                                                   System.out.println("hash="+ hash + ",wrongPassword="

                                                                     +wrongPassword + ",校验密钥匹配!就不可用!");

                                                   failure= true;

                                         }

                                         if(!validatePassword(password, hash)) {

                                                   System.out.println("FAILURE:GOOD PASSWORD NOT ACCEPTED!");

                                                  System.out.println("hash=" +hash + ",password=" + password

                                                                     +",校验密钥不匹配,hash就是password生成的!就不可用!");

                                                   failure= true;

                                         }

                                }

                                if(failure)

                                         System.out.println("TESTSFAILED!");

                                else

                                         System.out.println("TESTSPASSED!");

                       }catch (Exception ex) {

                                System.out.println("ERROR:" + ex);

                       }

             }

     

    }

    1.3    PBKDF2项目实践

    1,  用户注册,使用PBKDF2对密码进行加盐hash加密;

    2,  将salt盐和生成的hash密码存入数据库中;

    3,  用户登录对密码进行加盐hash;

    4,  校验密码;

    5,  用户每次登录,重复3/4步骤。

    如果想保存32位固定长度密码,可以在后面再进行一次MD5加密

     

    工具类:

    package com. common.utils;

     

    import java.math.BigInteger;

    import java.security.NoSuchAlgorithmException;

    import java.security.SecureRandom;

    importjava.security.spec.InvalidKeySpecException;

     

    import javax.crypto.SecretKeyFactory;

    import javax.crypto.spec.PBEKeySpec;

     

    /**

     *

     * @项目名称:common

     * @类名称:HashEncrypt

     * @类描述:使用PBKDF2对密码进行加密处理

     * @创建人:wyait

     * @创建时间:2017年4月24日 上午9:53:15

     *@version:

     */

    public class HashEncrypt {

             //pbkdf2 SHA1算法(由于JDK1.8以下只能使用SHA1,so....这将会是个历史遗留问题)

             publicstatic final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

             //=32/2,生成字符长度为32的salt值

             publicstatic final int SALT_BYTE_SIZE = 16;

             //48/2,生成字符长度为48的hash密码

             publicstatic final int HASH_BYTE_SIZE = 24;

             //加密迭代次数

             publicstatic final int PBKDF2_ITERATIONS = 1000;

     

             /**

              *

              * @描述:返回使用SecureRandom生成salt盐

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:40:14

              * @return

              */

             publicstatic String createSalt() {

                       //Generate a random salt:创建一个随机16位盐

                       SecureRandomrandom = new SecureRandom();

                       byte[]salt = new byte[SALT_BYTE_SIZE];

                       random.nextBytes(salt);

                       //转换为十六进制字符串,字符长度=32

                       returntoHex(salt);

             }

     

             /**

              *

              * @描述:返回使用PBKDF2对password进行加盐hash生成的字符串(字符长度48)

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午9:55:37

              * @param salt 盐

              * @param password  原始密码

              * @return

              * @throws NoSuchAlgorithmException

              * @throws InvalidKeySpecException

              */

             publicstatic String createHash(String salt, String password)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       returncreateHash(fromHex(salt), password.toCharArray());

             }

     

             /**

              *

              * @描述:返回使用PBKDF2对password字节数组进行加盐hash生成的字符串(字符长度48)

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午9:57:35

              * @param salt 盐转换为字节数组

              * @param password 密码转换为字符数组

              * @return

              * @throws NoSuchAlgorithmException

              * @throws InvalidKeySpecException

              */

             publicstatic String createHash(byte[] salt, char[] password)

                                throwsNoSuchAlgorithmException, InvalidKeySpecException {

                       //Hash the password :hash生成字节数组

                       byte[]hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);

                       //对字节数组进行hash返回字符串(加盐hash密码)

                       System.out.println("hash密钥字符串长度:"+ toHex(hash).length());

                       returntoHex(hash);

             }

     

             /**

              *

              * @描述:校验密码是否正确

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:02:49

              * @param salt 盐

              * @param password  密码

              * @param correctHash  加盐hash密码

              * @return

              * @throws NoSuchAlgorithmException

              * @throws InvalidKeySpecException

              */

             publicstatic boolean validatePassword(String salt, String password,

                                StringcorrectHash) throws NoSuchAlgorithmException,

                                InvalidKeySpecException{

                       returnvalidatePassword(fromHex(salt), password.toCharArray(),

                                         correctHash);

             }

     

             /**

              *

              * @描述:校验密码是否正确实现

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:07:14

              * @param salt  盐

              * @param password   密码

              * @param correctHash   加盐hash密码

              * @return

              * @throws NoSuchAlgorithmException

              * @throws InvalidKeySpecException

              */

             publicstatic boolean validatePassword(byte[] salt, char[] password,

                                StringcorrectHash) throws NoSuchAlgorithmException,

                                InvalidKeySpecException{

                       //将correctHash转换为字节数组

                       byte[]hash = fromHex(correctHash);

                       //对passwrod进行:加盐hash生成密码字符串,再比对correctHash

                       byte[]testHash = pbkdf2(password, salt, PBKDF2_ITERATIONS, hash.length);

                       //both hashes match.:比较密钥是否相等

                       returnslowEquals(hash, testHash);

             }

     

             /**

              *

              * @描述:比较两个字节数组的值是否相等

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:07:46

              * @param a

              * @param b

              * @return

              */

             privatestatic boolean slowEquals(byte[] a, byte[] b) {

                       intdiff = a.length ^ b.length;

                       for(int i = 0; i < a.length && i < b.length; i++)

                                diff|= a[i] ^ b[i];

                       returndiff == 0;

             }

     

             /**

              *

              * @描述:使用pbkdf2算法生成加盐hash字节数组

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:11:02

              * @param password

              * @param salt

              * @param iterations

              * @param bytes

              * @return

              * @throws NoSuchAlgorithmException

              * @throws InvalidKeySpecException

              */

             privatestatic byte[] pbkdf2(char[] password, byte[] salt, int iterations,

                                intbytes) throws NoSuchAlgorithmException, InvalidKeySpecException {

                       //PBEKeySpec:

                       //带有生成可变密钥大小的 PBE 密码的 PBEKey 时使用的一个密码、salt、迭代计数以及导出密钥长度的构造方法。如果指定

                       //password 为 null,则使用一个空 char[]。

                       //注:在将 password 和 salt 存储进新的 PBEKeySpec 对象前将其复制。

                       //参数:

                       //password - 密码。

                       //salt - salt。

                       //iterationCount - 迭代计数。

                       //keyLength - 要导出的密钥长度。

                       PBEKeySpecspec = new PBEKeySpec(password, salt, iterations, bytes * 8);

                       //SecretKeyFactory此类表示秘密密钥的工厂。

                       SecretKeyFactoryskf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);

                       //skf.generateSecret(spec)根据提供的密钥规范(密钥材料)生成 SecretKey 对象。

                       //SecretKey.getEncoded()返回基本编码格式的密钥,如果此密钥不支持编码,则返回 null。返回字节数组

                       returnskf.generateSecret(spec).getEncoded();

             }

     

             /**

              *

              * @描述:将十六进制字符串转换为字节数组

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:11:15

              * @param hex

              * @return

              */

             privatestatic byte[] fromHex(String hex) {

                       byte[]binary = new byte[hex.length() / 2];

                       for(int i = 0; i < binary.length; i++) {

                                binary[i]= (byte) Integer.parseInt(

                                                   hex.substring(2* i, 2 * i + 2), 16);

                       }

                       returnbinary;

             }

     

             /**

              *

              * @描述:将字节数组转换为十六进制字符串

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:11:22

              * @param array

              * @return

              */

             privatestatic String toHex(byte[] array) {

                       BigIntegerbi = new BigInteger(1, array);

                       Stringhex = bi.toString(16);

                       intpaddingLength = (array.length * 2) - hex.length();

                       if(paddingLength > 0)

                                returnString.format("%0" + paddingLength + "d", 0) + hex;

                       else

                                returnhex;

             }

     

             /**

              *

              * @描述:main方法测试

              * @创建人:wyait

              * @创建时间:2017年4月24日 上午10:23:53

              * @param args

              */

             publicstatic void main(String[] args) {

                       try{

                                //Print out 10 hashes

                                for(int i = 0; i < 10; i++) {

                                         Longs = System.currentTimeMillis();

                                         String salt = HashEncrypt.createSalt();

                                         //System.out.println(HashEncrypt.createHash("p\\r\\nassw0Rd!"));

                                         Longe = System.currentTimeMillis();

                                         System.out.println("生成加盐hash后密钥:第" +i + "次:hashPWd:"

                                                            +HashEncrypt.createHash(salt, "12003p\\r\\nassw0Rd!")

                                                            +",生成密码所用毫秒值:" + (String.valueOf(e - s)));

                                }

                                //Test password validation

                                booleanfailure = false;

                                System.out.println("Runningtests...");

                                for(int i = 0; i < 200; i++) {

                                         Longs = System.currentTimeMillis();

                                         Stringsalt = HashEncrypt.createSalt();

                                         Stringpassword = "" + i;

                                         Stringhash = createHash(salt, password);

                                         Stringsalt1 = HashEncrypt.createSalt();

                                         Longe = System.currentTimeMillis();

                                         System.out.println("password第一次加盐hash:"+ hash + ",生成密码所用毫秒值:"

                                                            +(String.valueOf(e - s)));

                                         StringsecondHash = createHash(salt1, password);

                                         System.out.println("password第二次加盐hash:"+ secondHash);

                                         //两个不同盐的hash密码比较

                                         if(hash.equals(secondHash)) {

                                                   //System.out.println("FAILURE: TWO HASHES ARE EQUAL!");

                                                   System.out.println("password="+ i

                                                                     +",加盐hash后生成的两个密钥相等!就不可用!");

                                                   failure= true;

                                         }

                                         StringwrongPassword = "" + (i + 1);

                                         //使用其他密码是hash比对

                                         if(validatePassword(salt1, wrongPassword, hash)) {

                                                   //System.out.println("FAILURE: WRONG PASSWORD ACCEPTED!");

                                                   System.out.println("hash="+ hash + ",wrongPassword="

                                                                     +wrongPassword + ",校验密钥匹配!就不可用!");

                                                   failure= true;

                                         }

                                         //用salt+password和使用它们生成的hash比对是否相等

                                         if(!validatePassword(salt, password, hash)) {

                                                   System.out.println("FAILURE:GOOD PASSWORD NOT ACCEPTED!");

                                                   System.out.println("hash="+ hash + ",password=" + password

                                                                     +",校验密钥不匹配,hash就是password生成的!就不可用!");

                                                   failure= true;

                                         }

                                }

                                if(failure)

                                         System.out.println("TESTSFAILED!");

                                else

                                         System.out.println("TESTSPASSED!");

                       }catch (Exception ex) {

                                System.out.println("ERROR:" + ex);

                       }

             }

     

    }

     


    本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1920128,如需转载请自行联系原作者

    展开全文
  • 彩虹表(Rainbow Tables)就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。越是复杂的密码,需要的彩虹表就越大,现在...

     

    一、什么是彩虹表?

    彩虹表(Rainbow Tables)就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。越是复杂的密码,需要的彩虹表就越大,现在主流的彩虹表都是100G以上。

    二、上哪找彩虹表去?

    现在有很多大牛已经把自己的彩虹表共享出来了,所以你可以去下载。还有一种方法就是自己通过工具生成。

    不过自己生成有点不切合实际,生成小的彩虹表吧数据少,可以破解密码的位数少(复杂程度低),而且费时费力,4核4GB内存的机器,生成2GB彩虹表,需要花费7天时间,而7天按1MB的带宽(160K/S左右)几乎可以下载30GB左右。

    生成的工具可以用RainbowCrack也可以用Cain。网上很容易搜索到下载地址的。

    下载彩虹表:

    1。MD5的彩虹表

    工具推荐:Free Rainbow Tables

    ftp:
    ftp://tbhost.eu/
    user:download
    pass:Tx50AbsBHq7Nya7n9weW
    http:
    http://tbhost.eu/rt.php
    http://freerainbowtables.mirror.garr.it/mirrors/freerainbowtables/
    提供了多种类型的彩虹表下载,LM、NTLM、MD5、SHA1等。千万别把人家法语字符的表也下了,对国人来说,几乎没什么用,不过如果你有特殊需要,那就下吧……这里提供的都是.rti格式的,有别于传统的.ri格式,.rti比.rt的多了一个目录.index文件,据说遍列速度比.rt的更快(未曾对比过,无法确定是否属实)。把你想要用的那个表下载下来,然后下载读取彩虹表的工具:rcracki_mt.exe

    把此工具及相关的dll文件复制到彩虹表所在目录,然后运行命令“F:\MD5>rcracki_mt.exe -h 3787795aeee01c9ab7267f252c932572 *.rti”就会开始破解(只能是32位密文)。

    2。LM-HASH的彩虹表(Windows登录密码)

    工具推荐:ophcrack

    http://www.hexsafe.com/download/Ophcrack%20XP%20Special%20Tables.torrent

    这个是Ophcrack XP Special Tables。一般非Vista的密码Hash,用它能破绝大部分,但在使用过程中也有发现有小部分Hash正确,但无法破解的。
    Vista的密码Hash可以在这里下表:http://www.hexsafe.com/download/Ophcrack%20Vista%20Special%20NTHASH%20Table.torrent

    这是Ophcrack Vista Special NTHASH的。官方是收费的表,不过国外共享了,也就可以免费得到了。如果这些表都跑不出来,而你又确定你的Hash没有搞错的话,那么只能找LC5出马了,LC5是一定能破的,只是时间有点久!

    其他工具还有一些,大家自己找找吧。不过这两个是经典的常用彩虹表。CMD5,或者Xmd5网站都开始收费了。大家还是自己拿机器跑吧(不缺钱的除外哦)

     

     

     

    展开全文
  • 比如我们在网络上下载的安装包,下载时都会提示MD5或者SHA1的校验是多少?有没有想过校验如何生成的了?以下就是用Objective-C来对文件计算checksum即校验是否 服务器端存储的一致,如果是一致的,则表示...
  • 而且通过本人推敲后结合实际应用而且构建出来的一段如何利用RSA加密算法保证通信过程中数据包不被第三方截获的技术,其中包含了 数字签名好双向加密、生成哈希码等技术进行了综合,让观察者容易了解如何保障通信 ...
  • 如何在 Windows 服务器建立远程访问 Jupyter Lab Server运行环境Jupyter Lab 安装或升级Jupyter Lab 环境配置获取哈希值密码配置jupyter环境文件启动 Anaconda Lab 运行环境 环境 信息 系统 阿里云 1核2G ...
  • 找不同,ASCII 求和,JavaScript,详细注释 LeetCode 题解:389. 找不同,位运算,JavaScript,详细注释 LeetCode 题解:200. 岛屿数量,DFS,JavaScript,详细注释 LeetCode 题解:433. 最小基因变化...
  •  实例107 使用哈希表对XML文件进行查询 127  实例108 计算两个矩形矩阵的乘积 129  第5章 面向对象编程技术 131 5.1 属性和方法 132  实例109 使用属性存储用户编号和姓名 132  实例110 通过定义方法求一...
  • 实例107 使用哈希表对XML文件进行查询 127 实例108 计算两个矩形矩阵的乘积 129 第5章 面向对象编程技术 131 5.1 属性和方法 132 实例109 使用属性存储用户编号和姓名 132 实例110 通过定义方法求一个数的平方 133 ...
  • 第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半。第二种思路...
  • 因此大家一定要自己做, 即使看了题解”会了“,也要自己一遍。自己不亲自写一遍,里面的细节永远不知道。 以下是我列举的经典题目(带 91 字样的表示出自 91 天学算法活动): 面试题 17.09. 第 k 个数 面试...
  • 我刚刚下载了他多年前使用的最好的朋友脚本,所有的密码都是使用MD5哈希,我想改变它.现在我的编码不太好,所以我问你们从哪里开始.我是在数据库中还是在脚本中转换它?我想从现在开始注册的每个人都有另一个哈希,我想...
  • 一招搞定GitHub下载加速! 为什么 Git把 SVN拍在了沙滩上! Git的由来、数据模型以及基础命令 Git操作与命令看这篇足矣! 开发软件 船新 IDEA 2020.1 真香体验! 没用过这些IDEA插件?怪不得写代码头疼 试水...
  • 使用nuget或Paket下载( ) 包裹: : 签名包-https: 如何使用 最简单的用法如下... 散列密码: string passwordHash = BCrypt . HashPassword ( " my password " ); 注意:尽管此库允许您提供自己的盐,但是...
  • Guide 哥注:权限管理系统在企业级的项目中一般都是非常重要的,如果你需求去实际了解一个不错的权限系统是如何设计的话,推荐你可以参考下面这些开源项目。 Spring-Cloud-Admin :Cloud-Admin 是国内首个基于 ...
  • The GNU C Library :本手册的目的是告诉你如何使用GNU C库。 框架 C++通用框架和库 abseil-cpp :Abseil C ++ 通用库。 Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合。 ...
  • 很多网站会提供下载文件的校验信息,在下载文件之后,如何方便地计算MD5 SHA1 SHA256等校验和呢?之前我常用的工具是Hash_1.0.4这个小工具,但是这个工具已经停止更新了,不支持SHA256算法,而很多文件的最新版本...
  • python模块—hashlib

    2020-12-27 10:53:18
    文章目录hashlib的基本概念如何产生哈希值的三个阶段检查文件一致性(保证文件下载过程中不丢包,保证数据的完整性)对明文密码进行加密破解用户注册密码hmac模块的加密方式 hashlib的基本概念 什么叫hash hash是...
  • 该库对程序员公开安全加密函数 如随机数生成,哈希,加盐哈希,消息认证,对称加密,非对称加密,混合加密,数字签名和内存保护。该库是伴随实现着一个复杂的参数,演示如何使用用CryptoLibrary. This library ...
  • 本工程中是从死锁、如何避免死锁、同步锁、读-写同步锁方面来介绍。 新增了 趣味练习:synchronized + 线程的挂起与唤醒,猜猜看输出什么? ...
  • (C)先从 PGP 服务器下载接受者的公钥 (D)以上说法都不对 使用PGP 6 对剪切板消息进行加密,要选择Clipboard 菜单的【B】? (A)Decrypt (B)Encrypt (C)Encrypt and Sign (D)Decrypt and Verify 使用PGP 6...
  • 我是下载方,应该如何使用标准提取式? 打开 115 DiscRobot点击「文件转存」,在下方会有一个标准提取式的选择项,打上勾就切换到标准提取式转存状态了 我是发布方,应该如何批量的将资源生成文档以便发布? 单一...
  • 23.2.5 使用Hashtable(哈希表)记录版本号及更新信息 23.3 类库设计过程 23.4 服务器端设计过程 23.4.1 服务器端主窗体预览 23.4.2 连接FTP服务器 23.4.3 向FTP服务器上传新版本 23.5 客户端设计过程 23.5.1 启动...
  • 23.2.5 使用Hashtable(哈希表)记录版本号及更新信息 23.3 类库设计过程 23.4 服务器端设计过程 23.4.1 服务器端主窗体预览 23.4.2 连接FTP服务器 23.4.3 向FTP服务器上传新版本 23.5 客户端设计过程 23.5.1 启动...
  • 23.2.5 使用Hashtable(哈希表)记录版本号及更新信息 23.3 类库设计过程 23.4 服务器端设计过程 23.4.1 服务器端主窗体预览 23.4.2 连接FTP服务器 23.4.3 向FTP服务器上传新版本 23.5 客户端设计过程 23.5.1 启动...
  • C++网络爬虫项目

    2018-07-04 00:59:17
    以搜索引擎首先面临的问题就是如何能够设计出高效的下载系统,将如此海量 的网页数据传送到本地,在本地形成互联网网页的镜像备份。 网络爬虫即扮演 如此角色。 它是搜索引擎中及其关键的基础构件。WEBCRAWLER 网络...
  • 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. ...
  • C#开发典型模块大全

    2014-03-12 18:11:22
    23.2.5 使用Hashtable(哈希表)记录版本号及更新信息 614 23.3 类库设计过程 615 23.4 服务器端设计过程 621 23.4.1 服务器端主窗体预览 621 23.4.2 连接FTP服务器 622 23.4.3 向FTP服务器上传新版本 623...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

哈希码如何下载