There aren't any obvious security weaknesses with your schemes. The original one (other than possibly not storing a version number with your hashes so you can upgrade your scheme to more rounds or a new pepper if necessary), or the new one layered with bcrypt. Bcrypt can take 72 bytes of input so there's no problem using sha256 as your hash.
I would be careful if you encode the output of your keystrengthened sha256hash before feeding it to bcrypt. In principle, its probably best to keep it in the binary form -- if you were using sha512, that would let all the bytes be used (as 72 bytes = 576 bits). Granted with sha-256, it doesn't matter as long as you do it correctly. A sha256 hash is 32 bytes long (in binary with non-printable letters), 44 bytes long after base64 encoding, 64 bytes long (in hexadecimal), but 88 bytes if you base64-encoded the hex-encoded hash (which would be partially truncated and slightly weaken security -- e.g., instead of 256-bits of inherent security you have 72/88*256 ~ 209 bits).
Note, if a user has an extremely high entropy password (e.g., 400-bits of entropy) that in principle would require ~2^400 time to crack, by using sha256 as an intermediate step it will only take time ~2^256 before its likely to find some password that works. Granted 2^256 is completely secure these days (as is anything significantly over ~2^80, so this difference has no practical relevance).
It does get more complicated and potentially more annoying to maintain (granted you could argue this is a good thing -- if your database was ever leaked it would be harder for an attacker to get a GPU to brute force it). If you ever upgrade your system and things don't work perfectly there are significantly more points where things could be going wrong. If someone new developer comes along and see hashes are in the form like bcrypt, they may assume they are just bcrypt and change something that breaks the system.
An alternative would be to keep both systems in place and gracefully upgrade users to bcrypt on their next successful login.
def login(username, password):
user = get_user(username)
if user.uses_old_hash():
calculated_old_hash = sha256_1000_round(password, salt=user.salt)
if constant_time_string_compare(user.hash, calculated_old_hash):
calculated_new_hash = bcrypt.hashpw(password, salt=bcrypt.gensalt(12))
user.hash = calculated_new_hash
print "Login Successful"
return True
else:
print "Login Failed"
return False
else:
hash = user.hash
calculated_new_hash = bcrypt.hashpw(password, salt=hash)
if constant_time_string_compare(hash, calculated_new_hash):
print "Login Successful"
return True
else:
print "Login Failed"
return False