首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的密码解密类有多安全?

我的密码解密类有多安全?
EN

Stack Overflow用户
提问于 2011-06-06 15:56:32
回答 2查看 427关注 0票数 4

我对任何类型的解密都是完全的初学者。我写了一个类,我认为它应该是非常安全的。你能就如何改进算法给我建设性的批评吗?

代码语言:javascript
复制
package main;

import java.util.Random;

public class Main {

   public static void main(String[] args) {
      //we will be playing around with this string
      new Main("1234567890abc");
   }

   private Random rnd;
   private byte[] randoms;

   /**
    * Starts up RNG
    * Prints out a test
    */
   public Main(String password) {
      //random long generated from the password
      long randomLong = randomNumber(password);
      //Random class using randomLong as seed
      rnd = new Random(randomLong);
      randoms = new byte[password.length()];
      //Array of random bytes generated with rnd
      rnd.nextBytes(randoms);

      System.out.println(randomNumber(password));

      String cryped = encrypt(password);
      String decryped = decrypt(cryped);

      System.out.println(cryped);
      System.out.println(decryped);
   }

   /**
    * Encrypts the password.
    */
   private String encrypt(String password) {
      char[] chars = password.toCharArray();      
      for (int i = 0; i < chars.length; i++) {
         chars[i] = (char) (chars[i] + randoms[i]);
      }
      return String.valueOf(chars);
   }

   /**
    * Decrypts an allready encryped password.
    */
   private String decrypt(String crypted) {
      char[] chars = crypted.toCharArray();
      for (int i = 0; i < chars.length; i++) {
         chars[i] = (char) (chars[i] - randoms[i]);
      }
      return String.valueOf(chars);
   }

   /**
    * Finds a random number BASED ON PASSWORD
    */
   private long randomNumber(String password)
   {
      char[] chars = password.toCharArray();
      long number = 0;
      for (char c : chars) {
         number += c;
      }
      number *= chars.length;
      return number;
   }
}

这个类是用Java编写的,但应该是任何人都可以读的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-06 16:04:37

  1. 不要在现实生活中重新发明自己的密码学(这是练习吗?)即使是专家也会犯错。使用已经公开的东西scrutinized.
  2. The java随机数生成器不是加密安全的。有了足够长的文本进行加密,就会出现允许各种信息泄露的模式,包括泄露密码(但请参阅第三点)和明文。
  3. 你可以使用密码作为随机数生成器的种子。这是一个标准的(也是很好的)想法,但是您可以使用一种不随排列变化的算法来实现!例如,您的加密将"sinecure“和"insecure”或其他与字形相同的密码(可能也包括其他密码)视为等同的。对于最多16个字母的强密码和超过255的码点,最高可达种子是255*16*16 = 65280;但可能性更小,因为有低于此的种子是无法到达的。在我的键盘上,bruteforcing只显示了9734种不同的密码种子,这些种子完全由键盘可写字符组成,不包括最多16个字符的换行符(我数到95);这是每个letter.
  4. CodeInChaos不到1位的熵在他的答案中有几个额外的观察结果:您正在使用流密码(更难正确!)。您还在加密密码,这表明您可能正在寻找散列而不是加密函数,(或者这只是一个示例?)。顺便说一句,如果您正在尝试存储密码,请不要使用
  5. ;不要-甚至不加密!看看索尼惨败的原因;你可能会被黑客入侵,你可能会丢失你的密码数据库,你的加密密钥可能会被攻击者知道。取而代之的是,使用标准的、最佳实践的密码散列(如果可能的话,最好使用标准的预先存在的组件)。这样的系统至少应该使用sha1或更好的安全散列;密码应该单独加盐(盐可以明文存储),并且应该使该过程在计算上代价高昂,以使暴力破解变得不具吸引力。请参阅http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html了解详细信息。
票数 10
EN

Stack Overflow用户

发布于 2011-06-06 16:01:50

以一种以上的方式可怕地破碎。

  1. 你的密钥是64位的,对今天来说有点小。但这是你目前最不担心的,

  1. ,我看到了一个非加密的PRNG。你需要使用一个加密的PRNG,

  1. ,你在流密码中重用了一个密钥。流密码因难以正确使用而臭名昭著。在这种操作模式下,它的行为基本上类似于由PRNG生成的一次性垫。一旦您在这种模式下重用密钥,您的加密就会被破解。

假设攻击者知道encrypt(p1)encrypt(p2)。然后,他可以计算出与p1-p2.

  • Your相同的encrypt(p1)-encrypt(p2),有效密钥大小远远小于64bit。字符串中的字符总和小于2^16*长度。对于大多数字符,它甚至是<128。所以你的key通常是一个小于1000‘000的数字。

  • randoms中的每个元素都是一个字节,即8位。字符是16位的。所以你不是在加256模。因此,您泄漏了有关加密密码的信息。

为了改进它,完全丢弃你自己的算法,使用一个众所周知的,经过审查的算法。发明自己的算法不是个好主意,除非你是密码学专家。即使是专家也会相对频繁地犯错误。

您是否真的需要密码解密(例如,它是一个密码存储),还是密码散列足够了?

我的建议是将您的主密码放在密钥派生函数中(PKDF2是一个常见的选择)。然后使用此函数返回的密钥,通过AES对数据文件的其余部分进行加密。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6249149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档