【问题标题】:Cryptographic hashing in Ceylon锡兰的加密哈希
【发布时间】:2018-04-08 10:41:35
【问题描述】:

在 Ceylon 中导入标准加密哈希(消息摘要)库(MD5、SHA1、SHA2、SHA256、SHA3 等)的推荐方法是什么?

【问题讨论】:

    标签: cryptography ceylon


    【解决方案1】:

    SDK 中似乎没有加密模块。

    Github 上有 Ceylon Crypto(以及 3 个单独的模块 in Herd),但它在 README 中说:

    请注意 IANAC(我不是密码学家),所以这肯定会在某些与安全相关的方面存在缺陷。

    不要在生产中使用,也不要以任何昂贵的方式依赖它!

    如果你只是想在 JVM 中使用它,我建议在 java.security(对于散列函数应该足够了)或 javax.crypto(对于密码等其他东西)中使用 Java 的加密 API。

    这里是一个例子,计算Hello World的SHA-256:

    module.ceylon:

    native("jvm")
    module example "1.0.0" {
        import java.base "8";
    }
    

    run.ceylon:

    import java.security {
        MessageDigest
    }
    import java.lang {
        JString=String,
        ByteArray
    }
    
    "Formats a single byte as a (two character) hexadecimal string."
    String formatByte(Byte byte)
            => Integer.format(byte.unsigned, 16).padLeading(2, '0');
    
    "Formats a Java byte array as a hexadecimal string."
    String formatByteArray(ByteArray result)
            => String.sum(result.byteArray.map(formatByte));
    
    "Calculates SHA-256('Hello World') and print it."
    shared void run() {
        value message = "Hello World";
        value bytes = JString(message).getBytes("UTF-8");
    
        value dig = MessageDigest.getInstance("SHA-256");
        value result = dig.digest(bytes);
    
        value formatted = formatByteArray(result);
        print("Result: ``result.array```");
        print("Length: ``result.size``");
        print("Result in hex: ``formatted``");
    }
    

    这个程序输出这个:

    Result: { -91, -111, -90, -44, 11, -12, 32, 64, 74, 1, 23, 51, -49, -73, -79, -112, -42, 44, 101, -65, 11, -51, -93, 43, 87, -78, 119, -39, -83, -97, 20, 110 }`
    Length: 32
    Result in hex: A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E
    

    不过,我没有找到可以让它更好一点的 Ceylon 包装器。

    【讨论】:

    • 这是一个很好的答案!我会稍微简化代码,使用result.byteArray 获得锡兰Bytes 的Array,而不是使用result.array 获得java.lang.Bytes 的Array
    • 我也会使用String.sum(...) 而不是String(expand(...))
    • @GavinKing 谢谢。不知何故,我错过了这个属性(或者实际上,我想知道为什么有两个属性相同)。 String.sum 我只是没能找到。它的命名似乎有点不直观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多