【问题标题】:How secure is this这有多安全
【发布时间】:2016-09-16 10:24:39
【问题描述】:

为了使其更适用于其他人,我想知道编写代码将加密消息到没有密码就不可能被解密的程度有多现实。我认为最好的方法是制作哈希算法并添加随机性。那么对于代码爱好者来说,编写声音加密有多现实呢?任何工程师都能够破解业余加密算法吗? 编辑:有几个答案讨论了对计算机内存的攻击,这是我很欣赏的有用信息,但我更想知道是否可以直接解密消息。我假设密码分析器无法访问混淆消息的计算机,因为如果他这样做了,他无论如何都可以查看我的源代码并找到解密算法。 这是我的例子:

public class Keys { // hold the methods and information used to lock, unlock, make the key, get the "keypad" after it has been locked, and a static method to change int[] to long[] 
// Fields
private String passphrase;
private long[] key;
private long keynum;
private long[] pad;
Random rands = new Random();
// Constructors
public Keys (String passphrase) // makes a key based of the given passphrase 
{
    this.passphrase = passphrase;
    key = keycipher(this.passphrase.toCharArray());
    key = keyfix(key);
    keynum = key[0];
    for (int i=1; i < key.length && key[i] != 0; i=i+1)
        if (i <key.length -1 && key[i] == key[i+1])
            keynum = keynum *key[i] +1;
       else if (i+1 < key.length)
        keynum = keynum * key[i] - key[i+1];
    else
            keynum = keynum * key[i] -1;
}

/**
 *used to lock and save a message in the pad field 
 * @param message2lock the input which will be locked using the key and saved as the field pad 
 */
public void lock (String message2lock)
{
   Message2Num holenums = new Message2Num(message2lock); // message2nums converts inout string to number []
   holenums.step1(); //uses custom cipher to change each character to a long 
   long[] hole =new long[holenums.step2().length];

   int t =0;

    for(int g : holenums.step2()) 
        /* // Step 2 uses the cipher from step 1 and hides it in random numbers by doubling the array length
        then making every even number in the array length a random number and every odd number the last random number 
        minus the original cipher number            
        */
    {
        hole[t] = (long) g;
        t++;
    }        
    hole = this.padding(hole);

    double p = (double) keynum;
    p = 3* Math.cos(p);
    long z = (long) p;
    for ( int i =0; i< hole.length; i++)
        hole[i] = hole[i] * keynum + z;
    hole = Message2Num.addcommas(hole);
    pad =hole;

}

【问题讨论】:

  • “这有多安全” ...private String passphrase; ...不是很安全。 (stackoverflow.com/questions/8881291/…)
  • "Schneier's Law": “任何人,从最无知的业余爱好者到最优秀的密码学家,都可以创建自己无法破解的算法。”所以答案是编写自己的加密代码是不现实的。最好的建议是使用当前标准:AES(高级加密标准)。要将密码转换为密钥,请使用 PBKDF1(基于密码的密钥派生函数 2)。
  • 这种事情千万不要在真实系统上做,请坚持使用已经接受安全的官方函数,除非你真的知道自己在做什么,否则不要使用自己的函数进行安全!
  • @Tom 谢谢!所以我使用 JTextField 来获取字符串,如果不是拉字符串我拉 String.tochar 或任何方法,它会更安全还是字符串问题使 JTextFields 不安全?
  • 如果您想从使用 Swing 的用户那里获取密码,请使用 JPasswordField

标签: java encryption hash password-encryption


【解决方案1】:

无需查看您的代码 - 两个问题的两个答案:

那么对于代码爱好者来说编写声音加密有多现实?

不切实际。即使是专业密码学家的实现也会不断受到攻击、暴露和削弱。除了需要可靠的数学运算外,旁通道攻击(例如时序、功耗)也是可能的,并且您可能会泄露内存中遗留的数据。

简而言之:除非这是您的业务,否则不值得实施您自己的加密。只需使用现有的实现。如果它们有缺陷,它们的缺陷就会更少,而您自己的将被更新。

任何工程师都能够破解业余加密算法吗?

是的。是的。因为你会犯菜鸟错误。已经有足够多的人因加密算法的不恰当实现而伤透了脑筋。不要将自己添加到列表中。

如果您这样做 - 不要将其称为加密,而应将其命名为混淆。这将是业余爱好者可以“安全地”做的事情

【讨论】:

    【解决方案2】:

    "Schneier's Law":“任何人,从最无知的业余爱好者到最优秀的密码学家,都可以创建自己无法破解的算法。”

    所以答案是,编写自己的加密代码是不现实的,即使你是一位经验丰富的密码学家。

    加密的最佳建议是使用当前标准:AES(高级加密标准)。

    要将密码转换为密钥,请使用 PBKDF2(基于密码的密钥派生函数 2)。

    【讨论】:

      【解决方案3】:

      有一个关于密码学的一般建议:不要自行开发,而是使用公开可用的算法。这是一个非常简单的原因:即使是专业人士也很容易出错,因此建议只使用经过广泛测试的算法。此外,初学者更容易出错。

      例如,让我们考虑一下您的代码:
      private String passphrase;:您正在使用String 来存储密码,因此它会在内存中保留很长时间,即使它不再使用了,甚至更长,因为它是Object 的一个属性。

      只有每一秒的值包含实际数据:这就是“通过默默无闻的安全性”。坏主意,正如Kerckhoff 所述。此外,它是无用的开销,因为很容易恢复最终的可执行文件以获取实际代码。

      实际数据是randomnumber - actual data的字符串:让我猜一下:Math.random(),还是Random.nextInt()?这不是加密安全 PRNG。换句话说:另一个破解加密的攻击向量。

      z 添加到整体结果中是一个好主意,除了一个问题:z 始终位于[-2, 2] 范围内,因此不会为算法增加太多安全性。在最好的情况下,这将使工作量增加 5 倍,同时增加算法的额外开销,从而使数据在 RAM 中的时间更长。

      一次加密所有内容:这给了攻击者足够的时间来控制明文和密文,因为在此期间,所有应该加密的数据都保留在内存中。唯一可能更糟糕的是直接将钥匙交给攻击者。

      这只是列表的开始,所有这些攻击向量都基于您发布的非常不完整且极其严重的代码。打破这个算法对于任何专业人士来说都是小菜一碟。

      TL;DR

      切勿将您自制的加密算法用于任何与安全相关的事情。它们极易出错,因此在大多数情况下(尤其是由初学者构建时)非常容易破解。

      【讨论】:

      • 是的,我使用了 math.random(),是的,我知道 Secure Random 只是感觉不到。我假设 Eve 只有消息输出而不是我的计算机
      • 这个回复很有帮助:)
      【解决方案4】:

      这不安全。不要这样做。我会考虑这种职业弊端。

      改为研究和使用标准的对称或非对称密码学。

      【讨论】:

        猜你喜欢
        • 2011-06-11
        • 1970-01-01
        • 2011-06-29
        • 2010-11-29
        • 2022-01-03
        • 1970-01-01
        • 2011-01-05
        • 2013-12-01
        • 2014-07-21
        相关资源
        最近更新 更多