Има два вида симетрични шифри - поточни и блокови. Поточните грубо могат да се оприличат на един PRNG - seed-ваш го с началната стойност (ключа) и това ти генерира поредица от стойности, уникална за ключа (keystream). Този keystream го XOR-ваш с plaintext-а и получаваш ciphertext. Когато искаш да декриптираш, отново "seed"-ваш с ключа, генерираш поредицата числа, XOR-ваш ги с ciphertext-а и получаваш plaintext-а. Това работи защото:
(P xor K) xor K = P xor (K xor K) = P xor 0 = P
Проблемът е че ако имаш P и (P xor K) много лесно можеш да вземеш K. Ако всички пароли са криптирани с един и същ ключ, тогава K се преизползва за всички и тогава е елементарно да вземеш плейнтекст паролите като ги XOR-неш с вече известното K.
Другият тип симетрични шифри са блоковете (Rijndael е такъв случай). Там нямаш keystream, с който XOR-ваш байт по байт плейнтекста, а оперираш върху блокове от плейнтекста с фиксирана дължина (примерно 128-битови блокове). Там има други въпросителни, като например режима на операция (всеки блок за себе си или нещо навързано). Ако е всеки блок за себе си (ECB) тогава има известни проблеми, примерно че е лесно дали паролите (част от паролите) са едни и същи за различните потребители.
Иначе няма как да е по-сигурно, човек сдобие ли се с ключа, всичко заминава. Симетричната криптография не е много добра идея за пазене на пароли, в този си вид. Разбира се, можеш да подходиш по друг начин и вместо да ползваш отделен хардкоднат ключ, за да криптираш паролата, можеш да ползваш паролата като ключ за криптиране на някакъв фиксиран (примерно нулев) блок. Това е далеч по-сигурно, защото ако лошият се сдобие с контрол върху системата, няма как лесно да разбие паролите. Обаче по този начин също така губиш и възможността да възтановяваш забравените пароли. На практика, нещата стават почти същите като с хешираните пароли. Ползването на хеш алгоритмите е по-добра идея обаче, от performance гледна точка най-малкото. После, ако ползваш симетрична криптография в такъв вид, трябва да решаваш още един проблем - ако директно ползваш паролата като ключ, дължината на ключа е равна на максималната дължина на паролата. Примерно блоковия алгоритъм работи с 128-битови ключове - максималната дължина на паролата става 16 символа. Има разни схеми, по които част от тези недостатъци могат да се решават, но като цяло е доста по-удобно с еднопосочен хеш алгоритъм.