Encryption 如何确定字节数组是否包含哈希数据

Encryption 如何确定字节数组是否包含哈希数据,encryption,hmacsha1,pbkdf2,Encryption,Hmacsha1,Pbkdf2,是否可以确定字节数组是否包含使用PBKDF2WithHmacSHA1散列的数据?是否有一种模式可以提供帮助?下面是我如何在Scala中解决这个问题的: class Password(value: String, salt: Option[String]) { private final val IterationCount = 2048 private final val KeyLength = 256 private final val SaltLength = KeyLengt

是否可以确定字节数组是否包含使用PBKDF2WithHmacSHA1散列的数据?是否有一种模式可以提供帮助?

下面是我如何在Scala中解决这个问题的:

class Password(value: String, salt: Option[String]) {

  private final val IterationCount = 2048
  private final val KeyLength = 256
  private final val SaltLength = KeyLength / 8

  ...

  def hash = {
    val zalt = if (salt.isDefined)
      salt.get.getBytes(DefaultCharset)
    else 
      SecureRandom.getInstance("SHA1PRNG").generateSeed(SaltLength)

    val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
    val secretKey = secretKeyFactory.generateSecret(
      new PBEKeySpec(value.toCharArray, zalt, IterationCount, KeyLength)
    )

    val byteBuffer = ByteBuffer.allocate(2 + KeyLength)
    byteBuffer.putShort(KeyLength)
    byteBuffer.put(secretKey.getEncoded)

    new Password(
      Base64.encodeBase64String(byteBuffer.array),
      Some(new String(zalt, DefaultCharset))
    )
  }

  def isHashed = Base64.decodeBase64(value).length > KeyLength
}

密钥的长度在编码哈希之前。。。为了确定当前的
密码
实例是否是散列的,我只需检查整个缓冲区的长度–完整的源代码可用。

您命名的函数不是一种加密形式,而是一个基于密码的密钥派生函数。如果数据中没有预先添加特定的标识符(这是特定于实现的),那么该函数的输出将看起来像随机数据。如果数据看起来不是随机的,则可能不会生成哈希;如果是这样,你就无法确定随机数据来自何处(除非你能猜出这个函数应该散列的密码)。谢谢。哦,我忘了一件事:SHA-1散列(以及PBKDF2WithHmacSHA1的输出)是160位长的。如果数组不完全由20个字节组成(并且没有额外的前缀或附加内容),则可以确定它不是这样的散列。