相同的哈希函数

时间:2017-01-03 09:42:02

标签: android database encryption hash cryptography

我想使用对称算法(AES)的Android数据库。

在密码学中有一个函数如下

some_function( a-4-digit-PIN, some_salt) {

    return some_hash;

}

4位数PIN和盐是互补的,可以改变但是功能应该产生相同的散列,无论它们可能是哪种组合。

想法是将盐存储在设备上,并通过短信向用户发送4位数PIN(以支持离线情况)。

每个用户手机上都有自己的盐店(当手机连接到互联网时,这些盐会定期从中央数据库更新。)

此函数生成的哈希用于生成数据库的密码,因此它应始终保持相同。

本质上,是否有一个函数/算法,其中多个PIN-salt对产生相同的散列。

1 个答案:

答案 0 :(得分:0)

您可以使用PBKDF2WithHmacSHA1并提供盐。在一些迭代之后,它将从您的密码生成SecretKey。请参阅此链接中的AES加密和生成盐的完整示例:

http://www.coderzheaven.com/2013/03/19/encrypt-decrypt-file-aes-algorithm-android/

public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
    // Number of PBKDF2 hardening rounds to use. Larger values increase
    // computation time. You should select a value that causes computation
    // to take >100ms.
    final int iterations = 1000; 

    // Generate a 256-bit key
    final int outputKeyLength = 256;

    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, outputKeyLength);
    SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
    return secretKey;
}