Tag: 密码学

如何正确做私钥pipe理

是否有人获得实践经验或参考实施符合PCI DSS安全标准的密钥pipe理scheme? 考虑到符合PCI DSS的公司数量,显然有相当多的实施,但试图find它们的细节是艰难的。 当它下降到存储私人数据时,讨论通常停止在使用哪种encryptionalgorithm。 之后,通常会有一个关于正确存储私钥的声明,但是没有讨论实际的方法来做这件事,或者像定期更换密钥或者提供应用程序的密钥之类的东西。 具体而言,我对PCI DSS标准第3.5节和第3.6节的要求感兴趣。 3.5.2将密钥安全地保存在尽可能less的位置和表格中。 3.6.avalidation用于encryption持卡人数据的密钥是否存在密钥pipe理程序。 注:关键pipe理的许多行业标准可以从各种资源中获得,包括NIST,可以在http://csrc.nist.govfind。 3.6.4validation密钥pipe理程序是否至less每年要求定期更换密钥。 根据PCI DSS要求文件的build议,我已经看了NISTencryption出版物 ,但除了最近的encryption密钥pipe理研讨会logging之外 ,似乎没有太多的真正可实施的scheme或标准。 至于我想做的事情不是: 存储密码+盐作为authentication的一种方式, select一个强大的数据encryptionsymmtericalgorithm, 避免首先存储私人数据。 避免使用其他机制进行密钥pipe理:物理安全,数据库安全,龙和向导等。 所有这些都是有效的担忧,但在这种情况下不是答案。 我的要求的坚果和螺丝是在一个不同的SO问题。networkingdevise模式存储和检索敏感的每个用户的数据,但这一切都归结为密钥pipe理,因此这个更精致的问题。

如何生成软件许可证密钥?

许可证密钥是反盗版措施的事实标准。 说实话,这使我感到安全通过朦胧 ,虽然我真的不知道如何生成许可证密钥。 什么是许可证密钥生成的好(安全)例子? 他们使用什么encryption原语(如果有的话)? 这是一个消息摘要? 如果是的话,他们将哈希数据? 开发人员采用什么方法来使破解者难以build立自己的密钥生成器? 密钥生成器是如何制作的?

Android 4.2打破了我的encryption/解密代码,提供的解决scheme无法正常工作

首先,我已经看到Android 4.2打破了我的AESencryption/解密代码和encryption错误在Android 4.2和提供的解决scheme: SecureRandom sr = null; if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) { sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); } else { sr = SecureRandom.getInstance("SHA1PRNG"); } 对我不起作用,因为在解码Android 4.2中的Android 4.2中encryption的数据时,我得到: javax.crypto.BadPaddingException: pad block corrupted at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:709) 我的代码很简单,直到Android 4.2: public static byte[] encrypt(byte[] data, String seed) throws Exception { KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecureRandom secrand = SecureRandom.getInstance("SHA1PRNG"); secrand.setSeed(seed.getBytes()); keygen.init(128, secrand); […]

你在哪里储存盐弦?

对数据库存储进行哈希密码处理时,我总是使用正确的per-entry saltstring。 为了我的需要,将散列密码旁边的salt存储在散列密码旁边一直工作正常。 但是,有些人build议将salt与数据库分开存放。 他们的观点是,如果数据库被攻破,攻击者仍然可以build立一个彩虹表,考虑一个特定的盐串,以便一次破解一个帐户。 如果这个帐号拥有pipe理员权限,那么他甚至不需要破解其他任何人。 从安全的angular度来看,将盐储存在不同的地方是值得的吗? 考虑在同一台机器上使用服务器代码和数据库的Web应用程序。 如果盐被存储在该机器上的平面文件中,那么很可能如果数据库受到损害,那么盐文件也是如此。 有没有推荐的解决scheme?

填充是无效的,不能被删除?

我已经在网上查找这个例外与我的程序有什么关系,但似乎无法find解决办法或为什么发生在我的特定程序中。 我一直在使用提供我的MSDN的例子来encryption和解密使用Rijndaelalgorithm的XmlDocument。 encryption工作正常,但是当我尝试解密时,我得到以下exception: 填充无效,无法删除 谁能告诉我,我能做些什么来解决这个问题? 我的代码如下,我得到的关键和其他数据。 如果cryptoMode为false,它将调用解密方法,这是发生exception的地方: public void Cryptography(XmlDocument doc, bool cryptographyMode) { RijndaelManaged key = null; try { // Create a new Rijndael key. key = new RijndaelManaged(); const string passwordBytes = "Password1234"; //password here byte[] saltBytes = Encoding.UTF8.GetBytes("SaltBytes"); Rfc2898DeriveBytes p = new Rfc2898DeriveBytes(passwordBytes, saltBytes); // sizes are devided by 8 because [ […]

如何解密SHA-256encryption的string?

我有一个string,使用下面的方法进行编码,有没有办法将这个string解码回原来的价值? 谢谢。 public synchronized String encode(String password) throws NoSuchAlgorithmException, IOException { String encodedPassword = null; byte[] salt = base64ToByte(saltChars); MessageDigest digest = MessageDigest.getInstance("SHA-256"); digest.reset(); digest.update(salt); byte[] btPass = digest.digest(password.getBytes("UTF-8")); for (int i = 0; i < ITERATION_COUNT; i++) { digest.reset(); btPass = digest.digest(btPass); } encodedPassword = byteToBase64(btPass); return encodedPassword; } private byte[] base64ToByte(String str) throws […]

从PEM BASE64获取RSA私钥编码的私钥文件

我有一个私钥文件(PEM BASE64编码)。 我想用它来解密一些其他的数据。使用Java我试图读取文件并解码BASE64编码的数据…这是我试过的代码片段…. import java.io.*; import java.nio.ByteBuffer; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import com.ibm.crypto.fips.provider.RSAPrivateKey; import com.ibm.misc.BASE64Decoder; public class GetPrivateKey { public static RSAPrivateKey get() throws Exception { File privateKeyFile = new File("privatekey.key"); byte[] encodedKey = new byte[(int) privateKeyFile.length()]; new FileInputStream(privateKeyFile).read(encodedKey); ByteBuffer keyBytes = new BASE64Decoder().decodeBufferToByteBuffer(encodedKey.toString()); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes.array()); KeyFactory kf = KeyFactory.getInstance("RSA", "IBMJCEFIPS"); RSAPrivateKey […]

Java默认的Crypto / AES行为

有谁知道默认的Javaencryption行为是什么: SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES"); Cipher localCipher = Cipher.getInstance("AES"); 具体来说,我期待了解这些类是如何生成IV的,以及指定“AES”时默认的encryption模式是什么。 谢谢。

SHA-1是否可以保存密码?

结论: SHA-1与任何对付原像攻击的攻击一样安全,但它易于计算,这意味着安装暴力破解或字典攻击更容易。 (对于像SHA-256这样的后继者也是如此)。根据具体情况,被devise为计算成本高昂的散列函数(比如bcrypt)可能是更好的select。 有些人大肆宣传“SHA-1已经破产”这样的言论,所以我试图去理解这个意思。 假设我有一个SHA-1密码哈希数据库,攻击者使用最新的SHA-1破解algorithm和一个拥有100,000台计算机的僵尸networking访问它。 (控制10万台家用电脑就意味着他们每秒可以做10 ^ 15次左右的操作。)他们需要多less时间 找出任何一个用户的密码? 找出给定用户的密码? 找出所有用户的密码? find一种方式作为用户之一login? find一种方式作为特定的用户login? 如果密码被腌制,这个变化如何? 腌制的方法(前缀,后缀,两者,还是像xor-ing更复杂的东西)的问题? 这是我目前的理解,一些谷歌search。 如果我误解了某些东西,请在答案中予以纠正。 如果没有盐,彩虹攻击会立即find所有的密码(除了非常长的密码)。 如果有足够长的随机盐,找出密码的最有效的方法是暴力或字典攻击。 冲突和原像攻击都不能帮助find真正的密码,所以对SHA-1的encryption攻击在这里没有任何帮助。 甚至使用什么algorithm都不算什么 – 甚至可以使用MD5或MD4,密码也是一样安全的(因为计算SHA-1散列速度较慢,所以稍有不同)。 为了评估“同样安全”的安全性,我们假设一次sha1运行需要1000次操作,并且密码包含大写,小写和数字(即60个字符)。 这意味着攻击者每天可以testing10 15 * 60 * 60 * 24/1000〜= 10 17的潜在密码。 对于暴力攻击,这意味着要在3个小时内testing所有密码,最多9个字符,一周最多10个字符,一年最多11个字符。 (每增加一个字符,就要花费60倍)字典攻击要快得多(甚至一台计算机的攻击者可能会在几个小时内就把它拉出来),但是只能find弱密码。 要以用户身份login,攻击者不需要find确切的密码; find一个导致相同散列的string就足够了。 这被称为第一次原像攻击。 据我所知,没有对SHA-1的原像攻击。 (暴力攻击需要2 160次操作,这意味着我们的理论攻击者需要10年30年的时间才能完成,理论可能性的限制大约是60次 ,攻击将需要几年时间)。 对减less的SHA-1版本的影响可以忽略不计(对于减less的SHA-1使用44步而不是80步,攻击时间从2 160次降到2 157次 )。 对SHA-1的碰撞攻击在理论上是可能的( 我发现的最好的结果是从2 80到2 52 ),但是对于密码哈希值,即使没有腌制,也是无用的。 简而言之,使用SHA-1存储密码看起来非常安全。 我错过了什么? 更新: […]

PHP的AESencryption/解密

我find了一个在PHP中使用/解码string的例子。 起初它看起来非常好,但它不会工作:-( 有谁知道问题是什么? $Pass = "Passwort"; $Clear = "Klartext"; $crypted = fnEncrypt($Clear, $Pass); echo "Encrypted: ".$crypted."</br>"; $newClear = fnDecrypt($crypted, $Pass); echo "Decrypted: ".$newClear."</br>"; function fnEncrypt($sValue, $sSecretKey) { return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sDecrypted, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); } function fnDecrypt($sValue, $sSecretKey) { return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sEncrypted), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); } 结果是: encryption: boKRNTYYNp7AiOvY1CidqsAn9wX4ufz/D9XrpjAOPk8= 解密: —‚(ÑÁ ^ […]